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)) バイトが最適です。