10

Java NIO を使用すると、ファイルをより高速にコピーできます。この仕事をするために、主にインターネットを介して2種類の方法を見つけました。

public static void copyFile(File sourceFile, File destinationFile) throws IOException {
    if (!destinationFile.exists()) {
        destinationFile.createNewFile();
    }

    FileChannel source = null;
    FileChannel destination = null;
    try {
        source = new FileInputStream(sourceFile).getChannel();
        destination = new FileOutputStream(destinationFile).getChannel();
        destination.transferFrom(source, 0, source.size());
    } finally {
        if (source != null) {
            source.close();
        }
        if (destination != null) {
            destination.close();
        }
    }
}

Java 開発者向けの20の非常に便利な Java コード スニペットで、別のコメントとトリックを見つけました。

public static void fileCopy(File in, File out) throws IOException {
    FileChannel inChannel = new FileInputStream(in).getChannel();
    FileChannel outChannel = new FileOutputStream(out).getChannel();
    try {
        // inChannel.transferTo(0, inChannel.size(), outChannel); // original -- apparently has trouble copying large files on Windows
        // magic number for Windows, (64Mb - 32Kb)
        int maxCount = (64 * 1024 * 1024) - (32 * 1024);
        long size = inChannel.size();
        long position = 0;
        while (position < size) {
            position += inChannel.transferTo(position, maxCount, outChannel);
        }
    } finally {
        if (inChannel != null) {
            inChannel.close();
        }
        if (outChannel != null) {
            outChannel.close();
        }
    }
}

しかし、私はその意味が何であるかを見つけたり理解したりしませんでした

「Windows 用マジック ナンバー (64Mb - 32Kb)」

Windows で問題があるとのことですinChannel.transferTo(0, inChannel.size(), outChannel)が、この方法では 32768 (= (64 * 1024 * 1024) - (32 * 1024)) バイトが最適です。

4

3 に答える 3

0

Windows 2000 オペレーティング システムとの互換性のためであると読みました。

ソース: http://www.rgagnon.com/javadetails/java-0064.html

引用: win2000 では、transferTo() は 2^31-1 バイトを超えるファイルを転送しません。「java.io.IOException: Insufficient system resources exist to complete the requested service is throw.」という例外をスローします。回避策は、データがなくなるまで毎回 64Mb のループでコピーすることです。

于 2014-01-04T03:26:41.080 に答える
-1

特定の Windows バージョンで一度に 64MB 以上を転送しようとすると、コピーが遅くなるという逸話的な証拠があるようです。transferToしたがって、チェック: これは、Windows で操作を実装する基礎となるネイティブ コードの詳細の結果のようです。

于 2011-09-11T16:12:21.323 に答える