摘录
在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 11 | FileInputStream和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程序更加健壮和优化。