Java FileUtils.copyFile()与FileChannel.transferTo()的比较

Java FileUtils.copyFile()与FileChannel.transferTo()的比较,java,android,file-copying,fileutils,filechannel,Java,Android,File Copying,Fileutils,Filechannel,我发现,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); 问题1:我的发现是对还是错

我发现,
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);
问题1:我的发现是对还是错?
问题2:是否有任何理由使用
FileUtils.copyFile()
作为
FileChannel.transferTo()
似乎应该更有效


谢谢

关于这一点,我告诉了大家一点,并得出以下结论:

在java中复制文件的4种方法

  • 使用apache commons IO复制文件
  • 使用
    java.nio.file.Files.Copy()复制文件

    这种方法编写起来非常快速和简单

  • 使用
    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();
    }
    
  • 使用FileStreams复制文件(如果您在较旧的java版本中受到冲击,则此版本适合您)

  • 紫软,谢谢。但是,我在android中找不到Files类。你确定它存在吗?应该是,看看这个,检查你的库并导入它是“文件”而不是“文件”。Android是基于Java 6的,Java 7的Java.nio.file类没有到Android的后端口。抱歉,更多信息:如果能看到每个案例的示例片段,那就太好了。此外,在Java 8中,案例(3)给出了以下gradle编译器问题:
    资源泄漏:''从不关闭。