2014-01-07 44 views
0

我有兩個文件使用相同的變量與下面的代碼的任務被閱讀:文件讀取在Java中,用相同的文件讀者

try { 
      FileInputStream fis = new FileInputStream(filename1); 
      InputStreamReader isr = new InputStreamReader(fis, "UTF8"); 
      BufferedReader br = new BufferedReader(isr); 
      String line=""; 
      while((line=br.readLine())!=null){ 
      System.out.println(line); 
      } 

      // Do i need to add these 3 statements ... 
      //br.close(); 
      //isr.close(); 
      //fis.close(); 
      //Without the above 3 statements also the code works fine ... 

      fis = new FileInputStream(filename2); 
      isr = new InputStreamReader(fis, "UTF8"); 
      br = new BufferedReader(isr); 
      line=""; 

      while((line=br.readLine())!=null){ 
      System.out.println(line); 
      } 

      br.close(); 
      isr.close(); 
      fis.close(); 

     } catch (Exception e) { 
      e.printStackTrace(); 
     } 

在Java中filereading並不理會關閉打開的流並釋放與第一個文件filename1相關的任何系統資源?

沒有拋出異常。

+0

那麼你的問題是什麼? –

+1

它不會是我的問題?因爲我正在做IO操作每次離開流打開... –

+1

可能有幫助http://stackoverflow.com/questions/18002896/is-closing-the-resources-always-important – zencv

回答

1

該代碼有效,但這不是一個好習慣。

當垃圾回收器決定運行並釋放您的第一個對象時,Java將自動關閉第一個文件。這可能會在您丟失對象的最後一個引用之後的任何時間發生,但根據您的內存條件甚至可能根本不會發生。

如果您使用的是Java 7,您可以使用嘗試用資源結構,它會調用close你:

try (FileInputStream fis = new FileInputStream(filename1); 
    InputStreamReader isr = new InputStreamReader(fis, "UTF8"); 
    BufferedReader br = new BufferedReader(isr)) { 
    // Code... 
} 
2

所以,你有資源泄漏不會造成一個問題你除非你;

  • 試圖刪除Windows上的文件(如文件仍處於打開狀態)
  • 做在這種情況下,你可能會用完文件句柄很多次。
1

爲StreamReader創建新實例後,自動爲先前打開的流調用垃圾回收。