JavaのBufferedWriterクラスを完全解説!初心者でもわかるファイル書き込み
生徒
「Javaでファイルにデータを書き込むには、どのクラスを使えばいいんですか?」
先生
「良い質問ですね。ファイル書き込みには、BufferedWriterクラスがよく使われます。効率よく文字列を書き込むことができるんですよ。」
生徒
「効率的というのはどういうことですか?」
先生
「通常の書き込みよりもバッファリング機能を使って高速化できるんです。詳しく見てみましょう!」
1. BufferedWriterクラスとは?
JavaのBufferedWriterクラスは、文字列を効率的にファイルに書き込むためのクラスです。このクラスはjava.ioパッケージに属しており、書き込み操作をバッファリングすることで速度を向上させます。
例えば、FileWriterだけを使ってデータを書き込むと、毎回ディスクへのアクセスが発生しますが、BufferedWriterを使えば、一時的にメモリ上にデータを蓄えてからまとめて書き込むので効率的です。
2. BufferedWriterの基本的な使い方
次に、基本的な使い方をサンプルコードで確認しましょう。
import java.io.BufferedWriter;
import java.io.FileWriter;
import java.io.IOException;
public class BufferedWriterExample {
public static void main(String[] args) {
String filePath = "example.txt";
try (BufferedWriter writer = new BufferedWriter(new FileWriter(filePath))) {
writer.write("こんにちは、BufferedWriter!");
writer.newLine();
writer.write("Javaのファイル書き込みは簡単です。");
System.out.println("ファイルに書き込みました。");
} catch (IOException e) {
e.printStackTrace();
}
}
}
上記のコードでは、try-with-resourcesを使用して、BufferedWriterのインスタンスを作成しています。writer.writeで文字列を書き込み、writer.newLineで改行を挿入します。
3. BufferedWriterを使う際の注意点
以下は、BufferedWriterを使用する際の注意点です。
- 書き込みが完了した後は
closeメソッド、またはtry-with-resourcesを使ってリソースを確実に解放する。 - バッファサイズを変更する場合、コンストラクタでサイズを指定できます。
- 例外処理を必ず実装して、エラー発生時にも適切な対応を行う。
4. BufferedWriterを使った応用例
複数行の文字列をリストから書き込む例を見てみましょう。
import java.io.BufferedWriter;
import java.io.FileWriter;
import java.io.IOException;
import java.util.List;
public class BufferedWriterAdvancedExample {
public static void main(String[] args) {
List<String> lines = List.of("1行目の内容", "2行目の内容", "3行目の内容");
String filePath = "multi_lines.txt";
try (BufferedWriter writer = new BufferedWriter(new FileWriter(filePath))) {
for (String line : lines) {
writer.write(line);
writer.newLine();
}
System.out.println("複数行を書き込みました。");
} catch (IOException e) {
e.printStackTrace();
}
}
}
このコードでは、リストの各要素をループで書き込んでいます。BufferedWriterは複数行の書き込みでも効率的に動作します。
5. 文字コード(エンコーディング)を指定して安全に書き込む
FileWriterはOS既定の文字コードを使うため、環境によっては文字化けが起きます。実務ではUTF-8を明示して再現性を高めるのが基本です。Files.newBufferedWriterならBufferedWriterを直接取得でき、文字コード指定も簡単です。
import java.nio.file.*;
import java.nio.charset.StandardCharsets;
import java.io.BufferedWriter;
import java.io.IOException;
public class BwEncodingExample {
public static void main(String[] args) {
Path path = Paths.get("utf8_example.txt");
try (BufferedWriter writer =
Files.newBufferedWriter(path, StandardCharsets.UTF_8)) {
writer.write("UTF-8で安全に書き込む");
writer.newLine();
writer.write("環境が変わっても文字化けしにくい");
} catch (IOException e) {
e.printStackTrace();
}
}
}
FileWriterを使っている場合は、new BufferedWriter(new OutputStreamWriter(new FileOutputStream(path), StandardCharsets.UTF_8))のようにラップしても同様の効果があります。6. 追記(append)と上書きの違いを理解しよう
既存ファイルに行を追加したい場合は「追記モード」を使います。デフォルトは上書きなので注意しましょう。
import java.nio.file.*;
import java.nio.charset.StandardCharsets;
import java.io.BufferedWriter;
import java.io.IOException;
import static java.nio.file.StandardOpenOption.*;
public class BwAppendExample {
public static void main(String[] args) {
Path path = Paths.get("logs/app.log");
try (BufferedWriter writer = Files.newBufferedWriter(
path,
StandardCharsets.UTF_8,
CREATE, // なければ作成
APPEND // あれば末尾に追記
)) {
writer.write("アプリケーション起動");
writer.newLine();
} catch (IOException e) {
e.printStackTrace();
}
}
}
- 上書き:既存の中身を消して書き直す。例:
Files.newBufferedWriter(path, UTF_8, CREATE, TRUNCATE_EXISTING) - 追記:末尾に追加。例:
APPENDオプション、またはnew FileWriter(file, true)
まとめ
今回の記事では、BufferedWriterクラスを用いたファイル書き込みの基本から応用までを解説しました。ポイントは、以下の通りです:
BufferedWriterは、バッファリング機能を使い効率的にファイルに文字列を書き込むクラス。- 基本的な使い方として、
writeメソッドで文字列を記述し、newLineで改行を追加できる。 - エラー処理には
try-catch構文を使用し、try-with-resourcesでリソースを自動的に解放する。 - バッファサイズの調整やリストからの複数行書き込みなどの応用が可能。
BufferedWriterは、初心者からプロフェッショナルまで幅広い用途で利用されており、特に効率的なファイル操作が求められる場面で力を発揮します。最後に、もう一つ応用例として、カスタムバッファサイズを指定したコードを紹介します。
import java.io.BufferedWriter;
import java.io.FileWriter;
import java.io.IOException;
public class CustomBufferSizeExample {
public static void main(String[] args) {
String filePath = "custom_buffer.txt";
int bufferSize = 8192; // 8KBのバッファサイズを指定
try (BufferedWriter writer = new BufferedWriter(new FileWriter(filePath), bufferSize)) {
writer.write("カスタムバッファサイズを使用して効率的に書き込みます。");
System.out.println("ファイルに書き込みました。");
} catch (IOException e) {
e.printStackTrace();
}
}
}
このコードでは、BufferedWriterのコンストラクタにバッファサイズを指定しています。このように、書き込みのニーズに合わせた調整が可能です。
生徒
「BufferedWriterクラスを使えば、ファイルの書き込みが高速化できるってわかりました!」
先生
「そうですね。特に大量のデータを書き込むときや、改行を挿入する必要がある場合に便利です。」
生徒
「エラー処理も重要なんですね。try-with-resourcesを使えば、自動でリソースを解放してくれるのが便利です!」
先生
「その通りです。また、応用としてバッファサイズを変更する方法や、リストのデータを一括で書き込む方法も覚えておきましょう。」
生徒
「今日はたくさん学べました!次は他のファイル操作のクラスも学びたいです。」