2021-07-20 2022-05-25

【Java】ファイル書き込み方法5選と速度比較【何が一番はやいのか】

メイン画像

Javaでのファイル書き込み方法5選と速度比較

 Javaでのファイル書き込み処理の速度が何を使うと一番はやいのか知りたかったため調査しました。今回は6つの方法を使ってそれぞれ速度を出してみました。

■本記事のまとめ

先に調査結果ですがPrintWriterを使用するのが一番速いということがわかりました。
1-6. PrintWriterの引数に1-2のBufferedWriterを設定
※PrintWriterはテキスト書き込み専用のため注意。

以下の記事も良ければ一緒にどうぞ。
【Java】ファイル読み込み方法7選と速度比較【1億行読み込んで、最も速いのは?】

それでは本題に入っていきます。

1. ファイル書き込みのソースコード6選(Java)

1-1. FileOutputStreamとBufferedWriter

 FileOutputStreamでファイルを書き込みするためのOutputStreamを生成し、OutputStreamWriterで文字コードを指定します。それをBufferedWriterに渡します。一般的なBufferedWriterで書き込みする方法①です。

 Copy
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) {
   // 例外
}

1-2. FileWriterとBufferedWriter

 FileWriterをBufferedWriterに渡します。FileWriterの生成時には、第2引数で文字コードを指定できます(指定しなくてもOK)。一般的なBufferedWriterで書き込みする方法②です。

 Copy
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) {
   // 例外
}

1-3. apache.commons.ioライブラリのIOUtils

 apache.commons.ioライブラリを使用してファイルに書き込みする方法です。writeLinesメソッドを以下の引数で呼び出します。

 第一引数:書き込みする情報(ListやSetなど)
 第二引数:ファイルに出力する改行コード(\n, \r\nなど)
 第三引数:FileOutputStream

処理がシンプルな反面、処理速度が遅いです。

 Copy
List writeLines= new ArrayList<>();
IOUtils.writeLines(writeLines, "\n", new FileOutputStream(
      outputFilePath), StandardCharsets.UTF_8);

1-4. FileWriter

 FileWriterを使用して、ファイルに書き込む方法です。

 Copy
List writeLines= new ArrayList<>();
try (FileWriter fw = new FileWriter(
      outputFilePath, StandardCharsets.UTF_8)) {
   for (String line : writeLines) {
      fw.write(line + "\n");
   }
} catch (IOException e) {
   // 例外
}

1-5. PrintWriter

 PrintWriterを使用して、ファイルに書き込む方法①です。PrintWriterはテキストを書き込みするためのものであることと、flushメソッドが自動的に呼び出されないことが注意点です。

 Copy
List writeLines = new ArrayList<>();
try (PrintWriter pw = new PrintWriter(
      outputFilePath, StandardCharsets.UTF_8)) {
   for (String line : writeLines) {
      pw.write(line + "\n");
   }
} catch (IOException e) {
   // 例外
}

1-6. PrintWriterの引数に1-2のBufferedWriterを設定

 PrintWriterを使用して、ファイルに書き込む方法②(おまけ)です。1-2で紹介したBufferedWriterをPrintWriterの引数に渡します。

 Copy
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) {
   // 例外
}

2. 速度比較の結果

 紹介した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回実行して平均値を出してみました。

3. まとめ

書き込み処理速度としては、PrintWriterを使用するのが一番速いということがわかりました。ただ注意点として上で書いているように、PrintWriterはテキスト書き込み専用のため、その点は注意してください。

今回の検証では明示的にflushメソッドを呼び出していないので、それによっても、結果が変わったりするかもしれません。もし興味がある方は試してみてください。

以下シンプルなまとめです。PrintWriter が速くて、apache.commons.ioが一番遅いです。

処理速度

PrintWriter > BufferedWriter > FileWriter > apache.commons.io ライブラリ

読み込みに関しては以下で調査していますので、良ければ一緒に読んで頂ければと思います。【Java】ファイル読み込み方法7選と速度比較【1億行読み込んで、最も速いのは?】

最後まで読んでいただき、ありがとうございました。

Scroll to Top