java File Stream と FileChannel の速度比較

こんにちわ、猫好きリーマンのほげPGです。
今更ながらFileChannelがどれくらいのものか分からなかったので調べてみました。

◇それぞれの特徴

Javaには、ファイル操作に使用できるさまざまなクラスとAPIがあります。その中でも、FileStreamとFileChannelはファイルの読み書きに使用される主要なクラスです。

FileInputStream/FileOutputStream (ファイルストリーム):

FileInputStreamとFileOutputStreamは、バイト単位でファイルを読み書きするためのストリームクラスです。これらのクラスは、シンプルで直感的な方法でファイルにアクセスできます。読み込んだり書き込んだりするデータは、バイト配列として処理されます。

FileChannel (ファイルチャネル):

FileChannelは、NIO(New Input/Output)パッケージで提供されるクラスです。ファイルの読み書きを行うための高度な制御を提供します。FileChannelは、ByteBufferを使用してデータの読み書きを行います。また、非同期IOやメモリマッピングファイルなどの高度な機能も提供されます。

 

主な違いは次のとおりです:

APIのレベル:

FileInputStream/FileOutputStreamは、古いI/O(InputStream/OutputStream)APIに基づいており、シンプルなバイトストリームの読み書きを提供します。FileChannelは、より新しいNIOパッケージに基づいており、ByteBufferを使用してデータの読み書きを行う高度な制御を提供します。

データの扱い方:

FileInputStream/FileOutputStreamはバイト配列を使用してデータを読み書きします。FileChannelはByteBufferを使用してデータの読み書きを行います。ByteBufferは、効率的なバッファリングや直接メモリアクセスなどの機能を提供します。

機能:

FileChannelは、非同期IOやメモリマッピングファイルなどの高度な機能を提供します。一方、FileInputStream/FileOutputStreamは、シンプルなファイルの読み書きに特化しています。

 

要約すると、FileInputStream/FileOutputStreamはシンプルなファイルの読み書きに使用され、FileChannelはより高度な制御と機能が必要な場合に使用されます。選択は、プロジェクトの要件とデータ操作のニーズに基づいて行う必要があります。

 

◇いざ速度比較

比較パターンは以下

  • 1ファイルの書き込み読み込み速度比較
  • 複数ファイルの書き込み読み込み速度比較

 

1, 1ファイル(200MB)の書き込み、読み込み速度比較

File Stream (msec)

書き込み 1回目:344

書き込み 2回目:343

書き込み 3回目:344

読み込み 1回目:219

読み込み 2回目:360

読み込み 3回目:172

FileChannel (msec)

書き込み 1回目:281

書き込み 2回目:249

書き込み 3回目:234

読み込み 1回目:125

読み込み 2回目:125

読み込み 3回目:126

 

2, 複数ファイル(1000ファイル)の書き込み、読み込み速度比較

File Stream (msec)

書き込み:3315

読み込み:776

FileChannel (msec)

書き込み:3304

読み込み:385

 

◇結論

FileChannel はサイズが大きいファイルは読み込み書き込みともに速い。

さいファイルでも書き込みは変わらないが読み込みは速い。

よってガンガン使うべし。

◇計測に使ったコード

Hoge.java