3

私は、かなりの量のデータをフォルダーからフォルダーに (一度に数十枚の写真の範囲で) コピーする必要があるプログラムを作成しています。もともと私はjava.io.FileOutputStream単純にバッファに読み込んで書き出すために使用していましたが、java.nio.FileChannel.

私が持っているデータを使用して本格的な管理されたテストを実行するためのリソースはありませんが、それぞれの利点が何であるかについてコンセンサスはないようです (FileChannel がスレッドセーフであることを除いて)。一部のユーザーFileChannelは、小さなファイルに最適であると報告していますが、他のユーザーは、大きなファイルで大幅な速度の向上を報告しています。

FileChannelそもそも作成の意図が何であったかを誰かが正確に知っているかどうか疑問に思っています.より良いパフォーマンスのために設計されたのでしょうか? どのような場合に?また、一般的な種類のデータに対して決定的なパフォーマンスの向上がありますか?それとも、十分に専門化されたデータを扱っていないため、違いは些細なものであると予想されますか?

編集:私のデータはスレッドセーフである必要はないと仮定します。

4

3 に答える 3

2

FileChannel.transferFrom/Toファイルコピーの場合、IOストリームよりも高速である必要があります。

または、Java7を使用することもできますjava.nio.file.Files.copy(source, target)。それはそれが得ることができるのと同じくらい速いはずです。

ただし、最終的には、パフォーマンスに目立った違いはありません。ハードディスクの速度がボトルネックになります。


FileChannelノンブロッキングではなく、選択できません。彼らが将来これらの機能を追加するかどうかはわかりません。ただし、 Java7にはAsynchronousFileChannelあります。

于 2011-07-05T21:20:44.527 に答える
1

入力ストリームと出力ストリームは、ファイルまたはリソースへのストリーム スタイルのアクセスを想定しています。役立つ追加の項目がいくつかあります (配列の読み取り) が、基本的な考え方は、一度に 1 つ以上の文字を読み取るストリームです (より多くの文字が使用可能になるまでブロックする可能性があります)。

チャネルは、情報をバッファにコピーする手段です。これにより、入力および出力ルーチンへの低レベルのアクセスが提供されます。思慮深いバッファサイズにより、スピードアップは印象的です。バッファーを中心にコードを構成すると、読み取りループで費やされる時間を短縮できます (パフォーマンスも向上します)。最後に、ブロックを回避するために入力ストリームの状態を事前にチェックすることは可能ですが、チャネルとバッファーを使用すると、ブロックしない方法で操作を実行できます (最悪の状況でも)。

于 2011-07-05T20:39:54.463 に答える
0

をご覧になりましたcommons-ioか?

FileUtils.copyFileToDirectory(srcFile, destDir);
于 2011-07-05T20:32:59.437 に答える