私はFile
が存在するかどうかをチェックするtry/catchブロックを持っています。そうでなければ、私はそれを作成し、それにFile
を書きます。それから私はFile
を読んだ。JavaはinputStreamを使用する前にoutputStreamを閉じることを希望しませんか?
ArrayList
は、ObjectInputStream
からオブジェクトを読み取って初期化されています。 FileOutputStream
とObjectOutputStream
を使用したファイルの元の書き込みでは、close()
を呼び出すと、ArrayList
はnull
のままです。 close()
への呼び出しを単に削除すると、すべてが計画どおりに実行されます。
これは私には逆のようです。 stream
を開いていれば、ファイルシステムは何とか "ロック"されていると思います。だから私はinputStream
を使う前にoutputStreams
を閉じようと思ったのです。しかし、いいえ、私はoutputStreams
を開いたままにしない限り、Javaはこの作業をさせません。
はここで、これが正しく動作することを可能にするclose()
にコメントアウトの呼び出しを含め、私のコードです:
try {
File file = context.getFileStreamPath("file");
} catch (Throwable e) {
e.printStackTrace();
try {
FileOutputStream fileOutputStream = context.openFileOutput("file", Context.MODE_PRIVATE);
ObjectOutputStream objectOutputStream = new ObjectOutputStream(fileOutputStream);
reminders = new ArrayList<Reminder>();
objectOutputStream.writeObject(reminders);
// fileOutputStream.close();
// objectOutputStream.close();
} catch (Throwable t) {
t.printStackTrace();
}
}
try {
FileInputStream fileInputStream = context.openFileInput("file");
ObjectInputStream objectInputStream = new ObjectInputStream(fileInputStream);
if (objectInputStream != null) {
reminders = (ArrayList<Reminder>) objectInputStream.readObject();
}
} catch (Throwable t) {
t.printStackTrace();
}
例外スタックトレースはありますか? –
'if(objectInputStream!= null)'チェックはここでは不要です(コンストラクタ呼び出しは 'null'を返すことはできません)。 –
あなたはストリームに空のarraylistを書いているようです。レコードを作成して閉じた場合はどうなりますか?出力ストリームオブジェクトがあなたのオブジェクトにいくつかの最小限のスペースを割り当てていて、閉じていなければGCされていないかどうかは疑問です。 – ethrbunny