Java中的文件读取,具有相同的文件读取器

时间:2014-01-07 09:39:13

标签: java performance file-io resource-leak

我使用以下代码使用相同的变量读取两个文件:

    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相关的任何系统资源?

没有抛出异常。

3 个答案:

答案 0 :(得分:2)

所以你有资源泄漏,除非你,否则不会给你造成任何问题;

  • 尝试在Windows上删除该文件(因为该文件仍处于打开状态)
  • 多次执行此操作,在这种情况下,您可能会用完文件句柄。

答案 1 :(得分: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...
}

答案 2 :(得分:1)

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