Java でファイルを閉じる

Rupam Yadav 2023年10月12日
  1. Javaでtry-with-resourcesを使用してファイルをクローズする方法(7+)
  2. Javaでファイルをクローズするためにclose()メソッドを使用する
  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ブロックが通常の終了または例外による終了であるかにかかわらず、リソースは自動的にクローズされます。ファイルを使用する際の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
  }
}

この例では、FileInputStreamを使用してファイルを開き、その内容を読み取ります。tryブロックが終了した際に、通常の終了または例外による終了であるかにかかわらず、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
  }
}

Javaでファイルをクローズするためにclose()メソッドを使用する

次のプログラムではBufferedWriterクラスを利用しています。このクラスは配列や文字列、文字を効率的に文字出力ストリームに書き込むために使用されます。

また、FileWriterクラスとBufferedWriterクラスを使用しています。

ファイルパスはFileクラスのインスタンスで表されます。指定されたパス名文字列から抽象パス名が構築されます。

BufferedWriterwrite()メソッドはテキストをファイルに保存します。newLine()メソッドは改行文字(/n)を行区切りとして追加します。

ほとんどのストリームは使用後に閉じる必要はありません。ソースがInput/Outputチャンネルの場合は、ストリームを閉じることを推奨します。

プログラムを終了する前、またはファイル操作を実行する前に、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