如标题中所述,重用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...");
}
答案 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或更高版本中使用自动资源管理。