1


ファイルを一括でコピーしたいのですが、ベスト プラクティスは何ですか?
たとえば、私は持っています:

LIst<String> pathesList ...
String dist = "c:/myfolder/";

簡単な方法は、pathesList をループしてスローし、すべてのパスを宛先フォルダーにコピーすることです。
私の質問は、何百ものファイルがあり、すべてのファイルが約 50 ~ 100 MB と非常に大きい場合です。
あなたは私に何を提案できますか?
多分マルチスレッドでファイルをコピーしますか?
ファイルは同じフォルダにありません。すべてのファイルの宛先は 1 つのフォルダです。ありがとう。

4

4 に答える 4

1

NIO 転送方法は、大きなファイルには最適ですが、小さなファイル (< 5 MB) には最速ではありません。しかし、カスタム バッファー戦略 (および NIO バッファーも) は、ファイルをコピーするための非常に高速な方法でもあります。

また、ネイティブ ユーティリティ ツールを使用してコピーを作成する方法は、大きなファイル (< 1 GB) の場合は NIO より高速ですが、外部プログラムを呼び出すコストがかかるため、小さなファイルの場合は非常に遅くなります。

したがって、おそらく最良の方法は、小さなファイルに対してカスタム バッファ戦略を作成し、大きなファイルに対して NIO 転送を行い、実際に大きなファイルに対してネイティブ実行可能ファイルを使用する方法です。しかし、他のコンピューターとオペレーティング システムでもテストを行うことは興味深いでしょう。

このベンチマークからいくつかのルールを取得できます。

  1. ファイルのコピーをバイト単位 (または文字単位) で作成したことはありません
  2. 読み取りメソッドの呼び出しを少なくするために、ストリームよりも自分の側のバッファーを優先しますが、ストリームの側のバッファーを忘れないでください
  3. バッファのサイズに注意してください
  4. ファイルのコンテンツのみを転送する必要がある場合は char 変換を使用しないでください。したがって、ストリームのみが必要な場合は Reader を使用しないでください。
  5. チャネルを使用してファイルを転送することを躊躇しないでください。ファイル転送を行うための最速の方法です。
  6. 本当に大きなファイルの場合にのみ、ネイティブの実行可能ファイルの呼び出しを検討してください。
  7. Java 7 の新しい Path メソッドは、2 つのディスク間で巨大なファイルを転送することを除けば、非常に高速です。

便利なリンク : Baptiste ブログ

于 2013-08-20T08:58:35.770 に答える
0

ディレクトリから別のディレクトリにすべてのファイルをコピーする必要があり、Java 7 で作業している場合は、java.nio.file.Files クラスの copy() メソッドを使用できます。ファイル システム プロバイダーを使用してファイルをコピーします。したがって、一連のファイルを反復処理する必要はなく、パフォーマンスは高くなります。

一方、ファイルを 1 つずつコピーする必要がある場合 (Java 1.4 以降)、集中的な I/O 操作用に設計されたパッケージ java.nio で利用可能な機能を使用できます。

// Getting file channels
 FileChannel in = new FileInputStream(source).getChannel();
 FileChannel out = new FileOutputStream(target).getChannel();

 // JavaVM does its best to do this as native I/O operations.
 in.transferTo(0, in.size(), out);

 // Closing file channels will close corresponding stream objects as well.
 out.close();
 in.close();
于 2013-08-20T09:09:07.723 に答える
-3

スレッドプールを使用:

  1. 固定番号を実行するスレッドプールを使用できます。ファイルをコピーするスレッドの。
  2. 各スレッドは異なるファイルをコピーします。
  3. 1 つのスレッドがコピーを終了するとすぐに。次のスレッドがプールに来て、次のファイルのコピーを続行します。

これにより、パフォーマンスが低下せず、複数のファイルを同時にコピーできます。

于 2013-08-20T08:32:44.353 に答える