0

我有两个文件要使用相同的变量读取任务,代码如下:

    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中的文件读取不关心关闭打开的流并为第一个文件filename1释放与之关联的任何系统资源?

没有抛出异常。

4

3 回答 3

2

因此,您有资源泄漏,除非您这样做,否则不会对您造成问题;

  • 尝试在 Windows 上删除该文件(因为该文件仍处于打开状态)
  • 多次这样做,在这种情况下您可能会用完文件句柄。
于 2014-01-07T09:45:29.070 回答
1

该代码有效,但这不是一个好习惯。

当垃圾收集器决定运行并释放您的第一个FileInputStream对象时,Java 将自动关闭第一个文件。这可能在您丢失对对象的最后一个引用后的任何时间发生,但甚至可能根本不会发生,具体取决于您的内存条件。

如果您使用的是 Java 7,则可以使用try with resources构造,它将close为您调用:

try (FileInputStream fis = new FileInputStream(filename1);
     InputStreamReader isr = new InputStreamReader(fis, "UTF8");
     BufferedReader br = new BufferedReader(isr)) {
    // Code...
}
于 2014-01-07T09:45:19.933 回答
1

为 StreamReader 创建新实例后,自动为先前打开的流调用垃圾收集。

于 2014-01-07T09:46:39.140 回答