Java 中的文件关闭

学习如何在访问 Java 中的文件时正确关闭 FileInputStream 和 FileOutputStream,以避免资源泄漏并优化性能。
On this page

Java 中的文件关闭

摘录

在Java中,使用FileInputStream和FileOutputStream类来读取和写入文件的原始字节。在访问文件后,适当关闭这些流以避免资源泄漏是很重要的。本文将介绍如何使用FileInputStream和FileOutputStream的close()方法来关闭流并释放系统资源。

介绍

Java中的FileInputStream类用于以原始字节流的形式从文件中读取数据。这对于读取图像文件、多媒体内容和其他二进制数据非常有用。类似地,FileOutputStream类允许将原始字节写入文件。

在打开流并从文件中读取或写入数据后,关闭流非常重要。未关闭流会导致应用程序中的文件句柄和内存泄漏。close()方法在FileInputStream和FileOutputStream上可用于关闭流。

关闭FileInputStream

要在从文件中读取后关闭FileInputStream,只需在流实例上调用close()方法:

1FileInputStream inputStream = new FileInputStream("data.bin");
2
3// read file
4
5inputStream.close();

close()方法关闭流并释放与其关联的任何系统资源,如文件句柄。即使在读取文件时发生异常,关闭流也很重要,以避免资源泄漏。close()方法本身不返回任何值,但如果在关闭流时发生任何错误,它可以抛出IOException

以下是在读取文件后正确关闭FileInputStream的示例:

 1FileInputStream inputStream = null;
 2
 3try {
 4
 5  inputStream = new FileInputStream("file.txt");
 6
 7  // read file
 8
 9  inputStream.close();
10
11} catch (IOException e) {
12
13  // handle exception
14
15} finally {
16
17  if (inputStream != null) {
18    inputStream.close();
19  }
20
21}

这样可以确保流在正常读取后关闭,并且在抛出异常的情况下也关闭。流在始终执行的finally块中关闭。

关闭FileOutputStream

与FileInputStream类似,写入数据到文件后关闭FileOutputStream非常重要。使用相同的close()方法来进行关闭:

1FileOutputStream outputStream = new FileOutputStream("data.bin");
2
3// write data to file
4
5outputStream.close();

与FileInputStream一样,这样可以释放操作系统资源,如文件句柄。确保在finally块中关闭流以确保执行:

 1FileOutputStream outputStream = null;
 2
 3try {
 4
 5  outputStream = new FileOutputStream("file.txt");
 6
 7  // write to file
 8
 9  outputStream.close();
10
11} catch (IOException e) {
12
13  // handle exception
14
15} finally {
16
17  if (outputStream != null) {
18    outputStream.close();
19  }
20
21}

这样可以在写入后正确关闭流,以及在出现任何异常时。

近期Java版本中的优化

在近期的Java版本中,对于关闭流和自动关闭资源进行了一些优化:

Java版本优化
Java 7使用try-with-resources语句来自动关闭流
Java 9更清洁、更高效的try-with-resources实现
Java 11FileInputStream和FileOutputStream实现了AutoCloseable接口
Java 16新增了Closeable.orElseThrow()方法

在Java 7中,引入了try-with-resources语句,允许在语句块执行完成后自动关闭流。这确保了即使发生异常,流也会被关闭:

1try (FileInputStream input = new FileInputStream("data.bin")) {
2
3  // read file
4
5} catch (Exception e) {
6
7  // handle exception
8
9}

流会在try块的末尾自动关闭。

Java 9对try-with-resources的实现进行了优化,使其更加高效和性能更好。

在Java 11中,FileInputStream和FileOutputStream类被改为实现了AutoCloseable接口,使其可以与try-with-resources一起自动关闭。

Java 16在Closeable接口上新增了一个orElseThrow()方法,用于在关闭时抛出异常(如果需要的话)。

结论

在访问文件后,应始终调用FileInputStream和FileOutputStream上可用的close()方法,以避免资源泄漏。确保在finally块中关闭流,以确保即使出现异常也能执行。正确关闭文件可使Java程序更加健壮和优化。