0

BufferedInputStream を使用してファイルをコピーしています。ループで byte[] をコピーします。これは、大きなファイルでは非常に遅くなります。

FileChannel 構造を見ました。これも使ってみました。FileChannel が IOSTreams を使用するよりも優れているかどうかを知りたいです。テスト中、大幅なパフォーマンスの向上は見られませんでした。

または、他のより良い解決策があります。

私の要件は、srcファイルの最初の1000バイトを変更してターゲットにコピーし、srcファイルの残りのバイトをターゲットファイルにコピーすることです。

ファイルチャンネルあり

private  void copyFile(File sourceFile, File destFile,byte[] buffer,int srcOffset, int destOffset) {
    try {
        if (!sourceFile.exists()) {
            return;
        }
        if (!destFile.exists()) {
            destFile.createNewFile();
        }
        FileChannel source = null;
        FileChannel destination = null;
        source = new FileInputStream(sourceFile).getChannel();
        source.position(srcOffset);
        destination = new FileOutputStream(destFile).getChannel();
        destination.write(ByteBuffer.wrap(buffer));
        if (destination != null && source != null) {
            destination.transferFrom(source, destOffset, source.size()-srcOffset);
        }
        if (source != null) {
            source.close();
        }
        if (destination != null) {
            destination.close();
        }

    } catch (Exception ex) {
        ex.printStackTrace();
    }
}

I/O ストリームの使用

while ((count = random.read(bufferData)) != -1) {

            fos.write(bufferData, 0, count);
        }
4

3 に答える 3

1

ハードディスク/SDカードの速度がボトルネックになっている可能性があるため、パフォーマンスを大幅に向上させることはできないと思います。

ただし、コピーを実行するバックグラウンドタスクを作成すると役立つ場合があります。

これは実際には高速ではありませんが、コピー操作の完了を待つ必要がないため、高速に感じられます。

このソリューションは、アプリが起動直後に結果を必要としない場合にのみ機能します。

詳細については、AsyncTaskを参照してください

于 2012-05-24T12:51:50.453 に答える
0

上書きと名前の変更を使用して、最終的にそれを行いました。Randomfile を使用して、最初の x バイトを上書きしました。次に、ファイルの名前を変更しました。現在は、サイズに関係なく、すべてのファイルに対してはるかに高速で、同じ時間がかかります。

ありがとう。

于 2012-05-27T06:32:00.567 に答える
0

transferFrom()ループで呼び出す必要があります。1 回の呼び出しで全額が送金される保証はありません。

于 2012-05-25T02:14:36.420 に答える