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
ブロックが通常の終了または例外による終了であるかにかかわらず、リソースは自動的にクローズされます。ファイルを使用する際の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
}
}
この例では、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
クラスのインスタンスで表されます。指定されたパス名文字列から抽象パス名が構築されます。
BufferedWriter
のwrite()
メソッドはテキストをファイルに保存します。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-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