Java -- 每日一问:Java有几种文件拷贝方式?哪一种最高效?

Posted Kevin-Dev

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Java -- 每日一问:Java有几种文件拷贝方式?哪一种最高效?相关的知识,希望对你有一定的参考价值。

典型回答

Java 有多种比较典型的文件拷贝实现方式,比如:

利用 java.io 类库,直接为源文件构建一个 FileInputStream 读取,然后再为目标文件构建一个 FileOutputStream,完成写入工作。


public static void copyFileByStream(File source, File dest) throws
        IOException 
    try (InputStream is = new FileInputStream(source);
         OutputStream os = new FileOutputStream(dest);)
        byte[] buffer = new byte[1024];
        int length;
        while ((length = is.read(buffer)) > 0) 
            os.write(buffer, 0, length);
        
    
 

或者,利用 java.nio 类库提供的 transferTo 或 transferFrom 方法实现。


public static void copyFileByChannel(File source, File dest) throws
        IOException 
    try (FileChannel sourceChannel = new FileInputStream(source)
            .getChannel();
         FileChannel targetChannel = new FileOutputStream(dest).getChannel
                 ();)
        for (long count = sourceChannel.size() ;count>0 ;) 
            long transferred = sourceChannel.transferTo(
                    sourceChannel.position(), count, targetChannel);            sourceChannel.position(sourceChannel.position() + transferred);
            count -= transferred;
        
    
 

当然,Java 标准类库本身已经提供了几种 Files.copy 的实现。

对于 Copy 的效率,这个其实与操作系统和配置等情况相关,总体上来说,NIO transferTo/From 的方式可能更快,因为它更能利用现代操作系统底层机制,避免不必要拷贝和上下文切换。

你的朋友是不是也在准备面试呢?你可以把今天的题目分享给好友,或许你可以帮到他。

以上是关于Java -- 每日一问:Java有几种文件拷贝方式?哪一种最高效?的主要内容,如果未能解决你的问题,请参考以下文章

每日一问:Redis有几种数据结构,底层分别是怎么存储的?

每日一问:Redis有几种数据结构,底层分别是怎么存储的?

每日一问:Redis有几种数据结构,底层分别是怎么存储的?

Java -- 每日一问:Java并发类库提供的线程池有哪几种? 分别有什么特点?

Java -- 每日一问:你了解Java应用开发中的注入攻击吗?

Java -- 每日一问:有哪些方法可以在运行时动态生成一个Java类?