【问题标题】:FileUtils.copyFile() VS FileChannel.transferTo()FileUtils.copyFile() VS FileChannel.transferTo()
【发布时间】:2016-05-11 05:05:01
【问题描述】:

我发现,copyToFile() 的底层操作系统调用是Libcore.os.read(fd, bytes, byteOffset, byteCount),而transferTo() 是基于内存映射文件的:

MemoryBlock.mmap(fd, alignment, size + offset, mapMode);
...
buffer = map(MapMode.READ_ONLY, position, count);
return target.write(buffer);

Q1:我的发现是对还是错?
Q2:有什么理由使用FileUtils.copyFile(),因为FileChannel.transferTo()似乎应该更有效?

谢谢

【问题讨论】:

    标签: java android file-copying fileutils filechannel


    【解决方案1】:

    我对此有所了解,得出以下结论:

    java中复制文件的4种方法

    1. 使用 apache commons IO 复制文件
    2. 使用java.nio.file.Files.copy()复制文件

      这种方法非常快速且易于编写。

    3. 使用java.nio.channels.FileChannel.transferTo()复制文件

    如果您喜欢通道类的出色性能,请使用此方法。

    private static void fileCopyUsingNIOChannelClass() throws IOException 
    {
        File fileToCopy = new File("c:/temp/testoriginal.txt");
        FileInputStream inputStream = new FileInputStream(fileToCopy);
        FileChannel inChannel = inputStream.getChannel();
    
        File newFile = new File("c:/temp/testcopied.txt");
        FileOutputStream outputStream = new FileOutputStream(newFile);
        FileChannel outChannel = outputStream.getChannel();
    
        inChannel.transferTo(0, fileToCopy.length(), outChannel);
    
        inputStream.close();
        outputStream.close();
    }
    
    1. 使用 FileStreams 复制文件(如果您对较旧的 Java 版本感到震惊,这个适合您。)

    【讨论】:

    • PurpleSoft,非常感谢。但是,我在 android 中找不到 Files 类。你确定它存在吗?
    • 应该是,看看这个link,检查你的库和导入
    • 这是“文件”而不是“文件s”。它也没有 copy() 方法。
    • Android 是基于 Java 6 的,并且没有将 Java 7 的 java.nio.file 类向后移植到 Android。抱歉更多信息:link
    • 很高兴看到每个案例的示例 sn-ps。此外,在 Java 8 中,案例 (3) 给出了以下 gradle 编译器问题:Resource leak: '<unassigned Closeable value>' is never closed.
    猜你喜欢
    • 2011-11-14
    • 2013-03-26
    • 1970-01-01
    • 1970-01-01
    • 2018-11-21
    • 1970-01-01
    • 2014-08-17
    • 2011-09-18
    • 1970-01-01
    相关资源
    最近更新 更多