2017-05-21 21 views
0

私はアンドロイドアプリケーションを作っています。これは設定アクティビティのファイルにデータを保存します。
ファイルを簡単に書くためにいくつかのカスタム関数を作成しました。設定アクティビティを含め、自分のすべてのアクティビティが継承するクラスにあります。突然ファイルへの読み書きができません

カスタム関数:

public void WriteToFile(String filename, String tag, String value) { 
    try { 
     FileOutputStream fileOut = openFileOutput(filename + ".txt", MODE_PRIVATE); 
     OutputStreamWriter writer = new OutputStreamWriter(fileOut); 
     writer.write(ReadFile(filename + ".txt") + tag + ":" + value + ";"); 
     writer.close(); 
    } catch (Exception e) { 
     Toast.makeText(this, "ERROR: " + e.toString(), Toast.LENGTH_LONG).show(); 
     Log.e("Error writing: ", e.toString()); 
    } 
} 

public void WipeFile(String filename) { 
    try { 
     FileOutputStream fileOut = openFileOutput(filename + ".txt", MODE_PRIVATE); 
     OutputStreamWriter writer = new OutputStreamWriter(fileOut); 
     writer.write(""); 
     writer.close(); 
    } catch (Exception e) { 
     Toast.makeText(this, "ERROR: " + e.toString(), Toast.LENGTH_LONG).show(); 
     Log.e("Error writing: ", e.toString()); 
    } 
} 

public String ReadFile(String filename) { 
    try { 
     FileInputStream fileIn = openFileInput(filename + ".txt"); 
     InputStreamReader InputRead = new InputStreamReader(fileIn); 
     char[] inputBuffer = new char[10000]; 
     String content = "", readString; 
     int charRead; 
     while ((charRead = InputRead.read(inputBuffer)) > 0) { 
      readString = String.copyValueOf(inputBuffer, 0, charRead); 
      content += readString; 
     } 
     InputRead.close(); 
     return content; 
    } catch (Exception e) { WipeFile(filename); return ""; } 
} 

public String FileValue(String filename, String tag, String defaultValue) { 
    String[] content = ReadFile(filename + ".txt").split(";"); 
    for (String pair : content) { 
     if (pair.split(":")[0].equals(tag)) return pair.split(":")[1]; 
    } WriteToFile(filename, tag, defaultValue); return defaultValue; 
} 

セッティングアクティビティ:奇妙な何

@Override 
@SuppressWarnings("ConstantConditions") 
protected void onCreate(Bundle savedInstanceState) { 
    ToolbarTitle = "Settings"; 
    ActivityID = R.layout.activity_settings; 
    ToolbarID = R.id.settings_toolbar; 
    ToolbarIcon = R.mipmap.settings_icon; 
    ActivityLayout = R.id.settings_layout; 
    super.onCreate(savedInstanceState); 

    if (prefs.getInt("LoggedinID", 0) == 0) findViewById(R.id.settings_user).setVisibility(View.GONE); 

    ArrayAdapter<CharSequence> adapter = ArrayAdapter.createFromResource(this, R.array.settings_lowBattery, android.R.layout.simple_spinner_item); 
    adapter.setDropDownViewResource(android.R.layout.simple_spinner_dropdown_item); 
    int spinnerPosition = adapter.getPosition(FileValue("settings", "Alert", "20%")); 
    Spinner battery = ((Spinner) findViewById(R.id.settings_battery)); 
    battery.setAdapter(adapter); 
    battery.setSelection(spinnerPosition); 

    ((Switch) findViewById(R.id.settings_notifications)).setChecked(FileValue("settings", "Notifications", "1").equals("1")); 

    findViewById(R.id.settings_ads).setVisibility((FileValue("settings", "Ads", "1").equals("1") ? View.VISIBLE : View.INVISIBLE)); 
} 

@SuppressWarnings("ConstantConditions") 
public void Apply(View view) { 
    WipeFile("settings"); 
    WriteToFile("settings", "Notifications", (((Switch) findViewById(R.id.settings_notifications)).isChecked() ? "1" : "0")); 
    WriteToFile("settings", "Alert", ((Spinner) findViewById(R.id.settings_battery)).getSelectedItem().toString()); 
} 

public void Ads(View view) { 
    Toast.makeText(this, "Just a prank, bro", Toast.LENGTH_SHORT).show(); 
    WriteToFile("settings", "Ads", "0"); 
} 

は、カスタム関数で、それは厄介だったときに、すべてが働いたということではなく、なぜ任意のアイデア?

この問題は、InputRead.read(inputBuffer)が-1(ファイル内のデータなし)を返すReadFile関数で発生しているようです。
ファイルへの書き込みまたはそれからの読み取り時ときに私が先に

おかげ

問題が
1だったのReadFile関数を解決し......、どこに問題があるにもチェックするか見当がつかないwriter.write関数の内部では、ファイルを開いて読み込むことができませんでした。
2.同じReadFile関数が(filename + ".txt")で提供され、 ".txt"も追加されました。

+0

ファイルが存在するとしますか?あなたが探しているファイルがないなどのテーマがあります。 –

+0

@VladMatvienkoまあ、ファイルがないときにうまくいきました。単にファイルを作成しただけです。 場合によっては、ファイルが存在することを確認する方法や作成する方法はありますか? –

+0

動作していた古いコードを見るとよいでしょう。あなたが考えることができるw peoblemsがあります... 1)あなたがそれを実行したときにファイルが閉じられていないので、あなたは情報を追加できません。 2)ファイルはそこにあります。更新されていないため、ファイルエクスプローラで表示されません。 –

答えて

0

問題は、あなたがファイルに追加されている方法であるかもしれないようにそれは内部的には、あなたの書き込み機能は、ファイルを開く

...そうです、それを閉じる前に、あなたの読み取り機能は、同じファイルを開き、それを閉じます。すでにオープンされているがクローズされていないため、ファイルをオープンしようとしたときにread関数が失敗している可能性があります。または、読み込み関数がファイルを閉じると、書き込み関数のファイルも閉じます。

したがって、問題は書き込み関数でファイルに追加したいが、それをうまく実装しない。内容をファイルに書き換える必要はありません。追加するファイルを開くには、適切なフラグを見つけるだけで済みます。

+0

これは問題でした。ありがとうございました(また、あなたのコメントから1つの小さなもの、私は推測すると1つの石を持つ2羽の鳥)。ありがとうございました:D –

0

設定にはのjava.util.Propertiesを使用する必要があります。これは、マップ< String、String >のようなものです。

すべての設定をロードするには、ロード(リーダーリーダー)を使用します。

すべての設定を保存するには、save(OutputStream out、String comments)を使用します。

+0

ああ..存在するかどうかわかりませんでした(明らかに私はこれで非常に新しいですよね?)、将来のプロジェクトでやります、ありがとう –

関連する問題