在 Java 中关闭文件
处理文件是Java编程中的一项基本任务,正确的资源管理至关重要。过去,关闭文件需要使用finally块或close()
方法进行手动干预,这可能容易出错并导致资源泄漏。
然而,自从Java 7引入了try-with-resources和继续使用close()
方法以来,文件管理变得更加高效和不容易出错。
在本文中,我们将探讨如何使用try-with-resources
和close()
方法来有效关闭Java文件。我们将讨论语法,提供每种方法的实际示例,并强调在处理文件时资源管理的重要性。
在Java中使用try-with-resources
关闭文件(7+)
在Java 7之前,开发人员必须使用finally
块手动关闭文件,这可能容易出错并导致资源泄漏。然而,自从Java 7引入了try-with-resources
,文件处理变得更加高效和不容易出错。
try-with-resources
是Java 7引入的一种语言特性,它简化了资源管理。它在try
块结束时自动关闭资源,例如文件,无论块是正常退出还是由于异常。使用try-with-resources
处理文件的语法非常简单:
try (ResourceType resource = new ResourceType()) {
// Use the resource here
} catch (Exception e) {
// Handle exceptions if necessary
}
// Resource is automatically closed when exiting this block
下面是如何使用try-with-resources
关闭文件:
- 资源初始化:在紧随
try
关键字的括号中,声明和初始化资源(在这种情况下,是与文件相关的类,如FileInputStream
,FileOutputStream
,BufferedReader
或BufferedWriter
)。资源应该实现AutoCloseable
接口或其子接口,例如Closeable
。 - 资源使用:在
try
块内部,根据需要使用资源进行读取,写入或其他操作。您不需要在代码中显式关闭资源。 - 资源关闭:一旦执行离开
try
块,无论是正常完成还是异常,资源将自动关闭。您不需要编写finally
块来确保关闭。
实际示例
让我们通过一个实际的例子来看看try-with-resources
如何与从文件中读取数据一起工作:
import java.io.FileInputStream;
import java.io.IOException;
public class FileReadExample {
public static void main(String[] args) {
try (FileInputStream fis = new FileInputStream("example.txt")) {
int data;
while ((data = fis.read()) != -1) {
System.out.print((char) data);
}
} catch (IOException e) {
e.printStackTrace();
}
// The FileInputStream is automatically closed
}
}
在这个例子中,我们在try
块内使用FileInputStream
打开一个文件并读取其内容。一旦块退出,无论是因为正常完成还是异常,FileInputStream
将自动关闭,释放系统资源。
异常处理
try-with-resources
还简化了异常处理。如果在try
块内部发生异常,资源将在异常向上传播之前自动关闭。您可以在catch
块中捕捉和处理异常。
import java.io.FileOutputStream;
import java.io.IOException;
public class FileWriteExample {
public static void main(String[] args) {
try (FileOutputStream fos = new FileOutputStream("output.txt")) {
// Write data to the file
fos.write("Hello, World!".getBytes());
} catch (IOException e) {
e.printStackTrace();
}
// The FileOutputStream is automatically closed
}
}
使用close()
方法关闭Java文件
以下程序中使用了BufferedWriter
类。此类允许您有效地将数组、字符串和字符写入字符输出流中。
我们还使用了为字符流编写设计的FileWriter
类和BufferedWriter
类。
文件路径由File
类的实例表示。指定的路径名构造了一个抽象路径名。
BufferedWriter
的write()
方法会将一些文本保存到文件中。newLine()
方法添加一个换行符/n
作为行分隔符。
大多数流在使用后不需要关闭。当源是输入/输出通道时,建议关闭流。
在终止程序或执行任何文件操作之前,我们应该调用close()
方法。如果我们不这样做,可能会丢失一些数据。
结果就是,为了关闭流并保护数据安全,使用了close()
方法。
流包括一个名为BaseStream.close()
的方法,它实现了Autoclosable
接口。几乎所有的流实例都不需要关闭,因为它们由集合支持,这些集合是不需要额外资源管理的数组。
如果源是I/O通道,则应该关闭流。
在执行写操作之前,文件的内容如下所示。
import java.io.BufferedWriter;
import java.io.File;
import java.io.FileWriter;
public class CloseFile {
public static void main(String[] args) throws Exception {
File file = new File("/Users/John/Temp/demo1.txt");
if (file.exists()) {
BufferedWriter bufferWriter = new BufferedWriter(new FileWriter(file, true));
bufferWriter.write("New Text");
bufferWriter.newLine();
bufferWriter.close();
}
}
}
执行写操作后,文件的内容发生了变化。
结论
在本文中,我们演示了如何使用try-with-resources
和close()
方法关闭文件,无论是读取还是写入操作,以及每种方法如何简化异常处理。
这些方法被视为现代Java编程中关闭文件和其他资源的最佳实践,确保高效可靠的资源管理。
Rupam Saini is an android developer, who also works sometimes as a web developer., He likes to read books and write about various things.
LinkedIn