2014-01-07 134 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创建新实例后,自动为先前打开的流调用垃圾回收。