2011-08-02 3 views
1

私はFileが存在するかどうかをチェックするtry/catchブロックを持っています。そうでなければ、私はそれを作成し、それにFileを書きます。それから私はFileを読んだ。JavaはinputStreamを使用する前にoutputStreamを閉じることを希望しませんか?

ArrayListは、ObjectInputStreamからオブジェクトを読み取って初期化されています。 FileOutputStreamObjectOutputStreamを使用したファイルの元の書き込みでは、close()を呼び出すと、ArrayListnullのままです。 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(); 
     } 
+0

例外スタックトレースはありますか? –

+1

'if(objectInputStream!= null)'チェックはここでは不要です(コンストラクタ呼び出しは 'null'を返すことはできません)。 –

+0

あなたはストリームに空のarraylistを書いているようです。レコードを作成して閉じた場合はどうなりますか?出力ストリームオブジェクトがあなたのオブジェクトにいくつかの最小限のスペースを割り当てていて、閉じていなければGCされていないかどうかは疑問です。 – ethrbunny

答えて

2

あなたがたFileOutputStreamを閉じるべきではありません。 objectOutputStreamのcloseはfileOutputStreamを閉じます。

objectOutputStreamを閉じると、fileOutputStreamが既に閉じられているため、objectOutputStreamがオブジェクトの内容をファイルにフラッシュするのを防ぐことができます。

objectOutputStream finalizeメソッドが範囲外になったときにコンテンツをフラッシュしない限り、どちらかを閉じるとコードを動作させることはできません。

+0

良い観察、私は間違った終了順序を見ていない。 –

+0

finalize()メソッドはありません。実際にはObjectから継承しています。したがって、他の基本クラスのいずれも1つもありません。 – EJP

関連する問題