FileUtils.copyFile()VS FileChannel.transferTo()

时间:2016-02-02 11:50:21

标签: 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);

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

由于

1 个答案:

答案 0 :(得分:4)

我对此有所了解并得出了这个结论:

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

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

    复制文件
      

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

  4. 使用java.nio.channels.FileChannel.transferTo()

  5. 复制文件

    如果您喜欢他们出色表现的频道课程,请使用此方法。

    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版本中受到攻击,那么这个版本适合您。)