3

サーバーからデータをコピーするタスクが与えられました。私はBufferedInputStreamデータをコピーするためにストリームを使用して出力しており、バイトごとにそれを行っています。実行中ですが、データの一部が100 MBであるため、データのコピーに時間がかかるため、確実に機能しません。私のコードが数百MBのファイルをコピーできるように、誰かが私にバイトごとのコピーの代替案を提案できますか?バッファは2048です。

これが私のコードがどのように見えるかです:

static void copyFiles(SmbFile[] files, String parent) throws IOException {

  SmbFileInputStream input = null;
  FileOutputStream output = null;
  BufferedInputStream buf_input = null;
  try {
    for (SmbFile f : files) {
      System.out.println("Working on files :" + f.getName());
      if (f.isDirectory()) {

        File folderToBeCreated = new File(parent+f.getName());
        if (!folderToBeCreated.exists()) {
          folderToBeCreated.mkdir();
          System.out.println("Folder name " + parent
                + f.getName() + "has been created");
        } else {
          System.out.println("exists");

        }

        copyFiles(f.listFiles(), parent +  f.getName());
      } else {

        input = (SmbFileInputStream) f.getInputStream();

        buf_input = new BufferedInputStream(input, BUFFER);

        File t = new File(parent + f.getName());
        if (!t.exists()) {
          t.createNewFile();
        }
        output = new FileOutputStream(t);

        int c;

        int count;
        byte data[] = new byte[BUFFER];

        while ((count = buf_input.read(data, 0, BUFFER)) != -1) {
          output.write(data, 0, count);
        }
      }
    }
  } catch (IOException e) {
    e.printStackTrace();

  } finally {
    if (input != null) {
      input.close();
    }
    if (output != null) {
      output.close();
    }
  }
}
4

4 に答える 4

16

これは、チャネルを使用してストリームのコピーを作成する方法を説明する優れた投稿へのリンクです。nio次のようなストリームをコピーできるヘルパーメソッドChannelTools.fastChannelCopyが導入されています。

final InputStream input = new FileInputStream(inputFile);
final OutputStream output = new FileOutputStream(outputFile);
final ReadableByteChannel inputChannel = Channels.newChannel(input);
final WriteableByteChannel outputChannel = Channels.newChannel(output);
ChannelTools.fastChannelCopy(inputChannel, outputChannel);
inputChannel.close();
outputChannel.close()
于 2012-12-06T16:39:43.903 に答える
4

を使用しているBufferedInputStreamので、バイトごとに読み取るのではなく、バッファのサイズを読み取っています。バッファサイズを増やしてみてください。

于 2012-12-06T16:39:18.113 に答える
1

実際の読み取り/書き込みはバッファサイズのチャンクで行われますが、バイト単位の読み取り/書き込みは確実に遅くなります。高速化する 1 つの方法は、ブロック単位で読み書きすることです。read(byte[] b, int off, int len)の方法をご覧くださいBufferedInputStream。ただし、おそらく十分な改善は得られません。

nioパッケージ (新しい IO) を使用して、nio チャネルを使用してデータをコピーする方がはるかに優れています。詳細については、nio のドキュメントを参照してください。

于 2012-12-06T16:40:23.157 に答える
1

FileUtilsfromを使用することをお勧めしますorg.apache.commons.io。ファイル操作を実行するのに十分なユーティリティ メソッドがあります。

org.apache.commons.io.FileUtils API ここ

于 2012-12-06T16:50:36.777 に答える