在 Java 中關閉檔案

Rupam Yadav 2024年2月15日
  1. 使用 try-with-resources 在 Java (7+) 中關閉檔案
  2. 使用 close() 方法在 Java 中關閉檔案
  3. 結論
在 Java 中關閉檔案

在 Java 程式中,處理檔案是一項基本任務,適當的資源管理是必要的。在過去,關閉檔案需要使用 finally 區塊或 close() 方法的手動介入,可能會出錯並導致資源洩漏。

然而,自從 Java 7 引入了 try-with-resources,並且持續使用 close() 方法後,管理檔案變得更有效率且更不容易出錯。

在本文中,我們將探討如何使用 try-with-resourcesclose() 方法在 Java 中有效地關閉檔案。我們將討論語法,提供每個方法的實際範例,並強調在處理檔案時資源管理的重要性。

使用 try-with-resources 在 Java (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 區塊內發生異常,資源會在異常在 Call Stack 往上傳播之前自動關閉。您可以根據需要在 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 接口。幾乎所有的串流實例都不需要被關閉,因為它們被集合支援,而集合是不需要任何額外資源管理的陣列。

如果來源是 IO 通道,則應該關閉該串流。

在進行寫入操作之前,以下是檔案的內容。

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