当前位置: 首页 > 面试题库 >

Windows中大文件的FileChannel.transferTo

齐夕
2023-03-14
问题内容

使用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;
    }
}


 类似资料:
  • 这个问题似乎不是关于特定的编程问题、软件算法或主要由程序员使用的软件工具。如果您认为该问题将在另一个Stack Exchange站点上讨论,您可以留下评论,解释该问题可以在何处回答。 未解决原始关闭原因 我有一个大小为2.5 GB的日志文件。有没有办法使用windows命令提示符将此文件拆分为更小的文件?

  • 我正在使用PyCharm社区版2016,我注意到我无法打开大型数据输入文件或日志(20MB)。编辑简单地说“文件XXX太大(大小)”。 不仅如此,似乎没有办法改变限制。官方文档提到了一种增加使用intellisense的最大大小的方法,但根本没有增加可以打开的文件的最大大小。这是真的吗?这真的是一个完全无法打开大型日志的IDE吗?

  • 如何从Windows文件夹下的所有文件中删除只读属性? 更新:更多的问题是关于如何删除只读属性使用gupfile

  • 我正在使用for Windows。据我所知,这个版本应该会解决文件名太长的问题。但对我来说不是。 当然,我做错了什么:我做了和,然后做了。一切顺利。但是,当我现在执行时,我会得到一个文件列表,其中文件名为。例如: 对我来说,复制非常简单:只需使用Angular generator(“yo Angular”)创建一个Yeoman web应用程序,并从文件中删除。然后重复前面提到的Git命令。 我错过

  • 问题内容: 我需要非常了解Java和内存问题的人的建议。我有一个大文件(大约1.5GB),我需要将此文件切成许多小文件(例如100个小文件)。 我通常知道如何做到这一点(使用),但是我想知道你是否对内存有任何建议,或者提示如何更快地做到这一点。 我的文件包含文本,它不是二进制文件,每行大约有20个字符。 问题答案: 首先,如果你的文件包含二进制数据,则使用将是一个大错误(因为你会将数据转换为Str

  • 我尝试搜索一个命令,该命令可以使用命令提示符命令列出目录中的所有文件以及子文件夹。我已经阅读了“dir”命令的帮助,但找不到我要查找的内容。请帮助我什么命令可以得到这个。