我应该在重用FileOutputStream时关闭流吗?

时间:2015-10-14 23:31:46

标签: java fileoutputstream

如标题中所述,重用FileOutputStream变量时是否应关闭流?例如,在以下代码中,我应该在为其分配新文件之前调用outfile.close()吗?为什么?

感谢:)

FileOutputStream outfile = null;
int index = 1;

while (true) {

    // check whether we should create a new file
    boolean createNewFile = shouldCreateNewFile();

    //write to a new file if pattern is identified
    if (createNewFile) {
        /* Should I close the outfile each time I create a new file?
        if (outfile != null) {
            outfile.close();
        }
        */
        outfile = new FileOutputStream(String.valueOf(index++) + ".txt");
    }

    if (outfile != null) {
        outfile.write(getNewFileContent());
    }

    if (shouldEnd()) {
        break;
    }
}

try {
    if (outfile != null) {
        outfile.close();
    }
} catch (IOException e) {
    System.err.println("Something wrong happens...");
}

3 个答案:

答案 0 :(得分:5)

是。完成一个文件(流)后,您应该始终关闭它。因此,使用文件(流)分配的资源将被释放到操作系统,如文件描述符,缓冲区等。

Java文档FileOutputStream.close()

  

关闭此文件输出流并释放与此流关联的所有系统资源。此文件输出流可能不再用于写入字节。

未封闭的文件描述符甚至可能导致java程序中的资源泄漏。 Reference

答案 1 :(得分:2)

我认为这里的混淆围绕着“重用”FileOutputStream的概念。您正在做的只是通过将新值与其关联,重新使用标识符(变量的名称outfile)。但这只对Java编译器有语法意义。名称引用的对象 - FileOutputStream - 被简单地放在地板上,最终将在未指定的时间点进行垃圾收集。使用曾经引用它的变量做什么并不重要。无论您是重新分配另一个FileOutputStream,将其设置为null还是让它超出范围都是一样的。

调用close将所有缓冲的数据显式刷新到文件并释放相关资源。 (垃圾收集器也会释放它们,但你不知道何时会发生这种情况。)请注意close也可能抛出IOException因此,你知道这个点的真正重要性尝试操作,只有在明确调用函数时才会这样做。

答案 2 :(得分:2)

即使没有自动资源管理,或try-with-resources(见下文),您的代码也可以更加可读和可靠:

for (int index = 1; shouldCreateNewFile(); ++index) {
  try (FileOutputStream outfile = new FileOutputStream(index + ".txt")) {
    outfile.write(getNewFileContent());
  }
}

但是,Java 7为闭包引入了一种新语法,在出现错误时更加可靠且信息丰富。使用它,您的代码将如下所示:

try

输出流仍将关闭,但如果{{1}}块内有异常,而关闭流时有另一个异常,则异常将被抑制(链接到主异常),而不是导致像前一个例子一样被丢弃的主要例外。

您应始终在Java 7或更高版本中使用自动资源管理。