Windows中大文件的FileChannel.transferTo

使用Java NIO可以更快地复制文件。我发现两种主要通过互联网执行此工作的方法。

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();

}

}

}

在20个对Java开发人员非常有用的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)”

它说inChannel.transferTo(0, inChannel.size(), outChannel)在Windows

中有问题,对于此方法,最佳值为32768(=(64 * 1024 * 1024)-(32 * 1024))字节。

回答:

Windows对最大传输大小有硬性限制,如果超过该限制,则会出现运行时异常。因此,您需要调整。您提供的第二个版本更好,因为它不假定一次transferTo()调用就完全传输了文件,这与Javadoc一致。

无论如何,将传输大小设置为大约1MB以上是毫无意义的。

您的第二个版本有缺陷。您应该减少size每次转帐的金额。应该更像是:

while (position < size) {

long count = inChannel.transferTo(position, size, outChannel);

if (count > 0)

{

position += count;

size-= count;

}

}

以上是 Windows中大文件的FileChannel.transferTo 的全部内容, 来源链接: utcz.com/qa/416686.html

回到顶部