2011-08-02 55 views
1

我有(無可否認奇怪)try/catch塊檢查是否存在File。如果沒有,那麼我創建它並寫一個File它。然後我讀了FileJava不希望我在使用inputStream之前關閉outputStream?

我有一個ArrayList正在通過從ObjectInputStream讀取對象進行初始化。在原始文件中使用FileOutputStreamObjectOutputStream,如果我對其調用close(),那麼我的ArrayList仍然爲null。如果我只是刪除電話close(),一切都按計劃進行。

這似乎倒退給我。如果我有某種類型的stream對它開放,我會認爲文件系統以某種方式被「鎖定」。這就是爲什麼我想在使用inputStream之前關閉outputStreams。但是,不,Java不會讓這個工作,除非我保持打開outputStreams

這裏是我的代碼,包括註釋掉調用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)'check在這裏應該是多餘的(構造函數調用永遠不會返回'null')。 –

+0

看起來你正在寫一個空的ArrayList到流中。如果你寫一條記錄然後關閉它會發生什麼?它讓我懷疑輸出流對象是否爲你的對象分配了一些最小空間,除非你關閉它,否則它還沒有被GC'd處理過。 – ethrbunny

回答

2

你不應該關閉FileOutputStream中。 objectOutputStream的close將關閉fileOutputStream。

由於fileOutputStream已經關閉,因此在objectOutputStream之前關閉fileOutputStream將阻止objectObjectStream將其內容刷新到文件。

不確定爲什麼不關閉要麼允許代碼工作,除非objectOutputStream finalize方法在超出範圍時刷新內容。

+0

良好的觀察,我沒有看到錯誤的關閉順序。 –

+0

它沒有finalize()方法,實際上它繼承了Object,所以其他基類都沒有。 – EJP

相關問題