
Javaでのファイル書き込み処理の速度が何を使うと一番はやいのか知りたかったため調査しました。今回は6つの方法を使ってそれぞれ速度を出してみました。
先に調査結果ですがPrintWriterを使用するのが一番速いということがわかりました。
⇒
1-6. PrintWriterの引数に1-2のBufferedWriterを設定
※PrintWriterはテキスト書き込み専用のため注意。
以下の記事も良ければ一緒にどうぞ。
【Java】ファイル読み込み方法7選と速度比較【1億行読み込んで、最も速いのは?】
それでは本題に入っていきます。
FileOutputStreamでファイルを書き込みするためのOutputStreamを生成し、OutputStreamWriterで文字コードを指定します。それをBufferedWriterに渡します。一般的なBufferedWriterで書き込みする方法①です。
List writeLines = new ArrayList<>();
try (BufferedWriter bw = new BufferedWriter(
new OutputStreamWriter(
new FileOutputStream(outputFilePath), StandardCharsets.UTF_8))) {
for (String line : writeLines) {
bw.write(line + "\n");
}
} catch (IOException e) {
// 例外
}
FileWriterをBufferedWriterに渡します。FileWriterの生成時には、第2引数で文字コードを指定できます(指定しなくてもOK)。一般的なBufferedWriterで書き込みする方法②です。
List writeLines = new ArrayList<>();
try (BufferedWriter bw = new BufferedWriter(
new FileWriter(outputFilePath, StandardCharsets.UTF_8))) {
for (String line : writeLines) {
bw.write(line + "\n");
}
} catch (IOException e) {
// 例外
}
apache.commons.ioライブラリを使用してファイルに書き込みする方法です。writeLinesメソッドを以下の引数で呼び出します。
第一引数:書き込みする情報(ListやSetなど)
第二引数:ファイルに出力する改行コード(\n, \r\nなど)
第三引数:FileOutputStream
処理がシンプルな反面、処理速度が遅いです。
List writeLines= new ArrayList<>();
IOUtils.writeLines(writeLines, "\n", new FileOutputStream(
outputFilePath), StandardCharsets.UTF_8);
FileWriterを使用して、ファイルに書き込む方法です。
List writeLines= new ArrayList<>();
try (FileWriter fw = new FileWriter(
outputFilePath, StandardCharsets.UTF_8)) {
for (String line : writeLines) {
fw.write(line + "\n");
}
} catch (IOException e) {
// 例外
}
PrintWriterを使用して、ファイルに書き込む方法①です。PrintWriterはテキストを書き込みするためのものであることと、flushメソッドが自動的に呼び出されないことが注意点です。
List writeLines = new ArrayList<>();
try (PrintWriter pw = new PrintWriter(
outputFilePath, StandardCharsets.UTF_8)) {
for (String line : writeLines) {
pw.write(line + "\n");
}
} catch (IOException e) {
// 例外
}
PrintWriterを使用して、ファイルに書き込む方法②(おまけ)です。1-2で紹介したBufferedWriterをPrintWriterの引数に渡します。
List writeLines = new ArrayList<>();
try (PrintWriter pw = new PrintWriter(new BufferedWriter(new FileWriter(
outputFilePath, StandardCharsets.UTF_8)))) {
for (String line : writeLines) {
pw.write(line + "\n");
}
} catch (IOException e) {
// 例外
}
紹介した5つ + おまけのコードをそれぞれ実行して処理速度を出しました。
1000万文字列(1文字列あたり5~12文字)が入ったリストを使用してファイルに書き込みした時間になります。実行環境はeclipseでメモリは3ギガバイト割り当てていました。
処理 | 速度(ms) |
---|---|
1-1 | 1052 |
1-2 | 861 |
1-3 | 50435 |
1-4 | 970 |
1-5 | 707(平均:726.44) |
1-6 | 698(平均:723.71) |
結果ですが、表を見ていただいてわかる通り
1-6. PrintWriterの引数に1-2のBufferedWriterを設定(おまけ)
の方法が一番処理速度が速い
ということがわかりました。1-5と1-6に関しては、1回目実行時は1-5、2回目実行時は1-6が速いということがあったので、100回実行して平均値を出してみました。
書き込み処理速度としては、PrintWriterを使用するのが一番速いということがわかりました。ただ注意点として上で書いているように、PrintWriterはテキスト書き込み専用のため、その点は注意してください。
今回の検証では明示的にflushメソッドを呼び出していないので、それによっても、結果が変わったりするかもしれません。もし興味がある方は試してみてください。
以下シンプルなまとめです。PrintWriter が速くて、apache.commons.ioが一番遅いです。
PrintWriter > BufferedWriter > FileWriter > apache.commons.io ライブラリ
読み込みに関しては以下で調査していますので、良ければ一緒に読んで頂ければと思います。【Java】ファイル読み込み方法7選と速度比較【1億行読み込んで、最も速いのは?】
最後まで読んでいただき、ありがとうございました。