在 Java 中关闭文件

Rupam Yadav 2024年2月15日
  1. 在Java中使用try-with-resources关闭文件(7+)
  2. 使用close()方法关闭Java文件
  3. 结论
在 Java 中关闭文件

处理文件是Java编程中的一项基本任务,正确的资源管理至关重要。过去,关闭文件需要使用finally块或close()方法进行手动干预,这可能容易出错并导致资源泄漏。

然而,自从Java 7引入了try-with-resources和继续使用close()方法以来,文件管理变得更加高效和不容易出错。

在本文中,我们将探讨如何使用try-with-resourcesclose()方法来有效关闭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关闭文件:

  1. 资源初始化:在紧随try关键字的括号中,声明和初始化资源(在这种情况下,是与文件相关的类,如FileInputStreamFileOutputStreamBufferedReaderBufferedWriter)。资源应该实现AutoCloseable接口或其子接口,例如Closeable
  2. 资源使用:在try块内部,根据需要使用资源进行读取,写入或其他操作。您不需要在代码中显式关闭资源。
  3. 资源关闭:一旦执行离开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类的实例表示。指定的路径名构造了一个抽象路径名。

BufferedWriterwrite()方法会将一些文本保存到文件中。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-resourcesclose()方法关闭文件,无论是读取还是写入操作,以及每种方法如何简化异常处理。

这些方法被视为现代Java编程中关闭文件和其他资源的最佳实践,确保高效可靠的资源管理。

作者: Rupam Yadav
Rupam Yadav avatar Rupam Yadav avatar

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

相关文章 - Java File