java复制文件的4种方式

Java 的几种文件拷贝方式 Files.copy方法在Java中是用来复制文件的一种高级操作,它是基于Java NIO(New Input/Output)的文件API实现的。需要注意的是,在某些操作系统和文件系统中,transferTo 方法可能会限制传输的最大字节数,因此在实际使用中可能需要进行分块传输。使用FileInputStream和FileOutputStream是实现文件拷贝的一种直观且简单的方法,尽管它不如NIO提供的Files.copy方法高效,但在某些情况下仍然非常有用。 阅读详情

Java NIO包括transferFrom方法,根据文档应该比文件流复制的速度更快。 这是第二种方法的代码:

复制代码

 1 private static void copyFileUsingFileChannels(File source, File dest) throws IOException {    
 2         FileChannel inputChannel = null;    
 3         FileChannel outputChannel = null;    
 4     try {
 5         inputChannel = new FileInputStream(source).getChannel();
 6         outputChannel = new FileOutputStream(dest).getChannel();
 7         outputChannel.transferFrom(inputChannel, 0, inputChannel.size());
 8     } finally {
 9         inputChannel.close();
10         outputChannel.close();
11     }
12 }

复制代码

三、使用Commons IO复制

Apache Commons IO提供拷贝文件方法在其FileUtils类,可用于复制一个文件到另一个地方。它非常方便使用Apache Commons FileUtils类时,您已经使用您的项目。基本上,这个类使用Java NIO FileChannel内部。 这是第三种方法的代码:

1 private static void copyFileUsingApacheCommonsIO(File source, File dest)
2         throws IOException {
3     FileUtils.copyFile(source, dest);
4 }

该方法的核心代码如下:

复制代码

 1 private static void doCopyFile(File srcFile, File destFile, boolean preserveFileDate) throws IOException {
 2         if (destFile.exists() && destFile.isDirectory()) {
 3             throw new IOException("Destination '" + destFile + "' exists but is a directory");
 4         }
 5 
 6         FileInputStream fis = null;
 7         FileOutputStream fos = null;
 8         FileChannel input = null;
 9         FileChannel output = null;
10         try {
11             fis = new FileInputStream(srcFile);
12             fos = new FileOutputStream(destFile);
13             input  = fis.getChannel();
14             output = fos.getChannel();
15             long size = input.size();
16             long pos = 0;
17             long count = 0;
18             while (pos < size) {
19                 count = size - pos > FILE_COPY_BUFFER_SIZE ? FILE_COPY_BUFFER_SIZE : size - pos;
20                 pos += output.transferFrom(input, pos, count);
21             }
22         } finally {
23             IOUtils.closeQuietly(output);
24             IOUtils.closeQuietly(fos);
25             IOUtils.closeQuietly(input);
26             IOUtils.closeQuietly(fis);
27         }
28 
29         if (srcFile.length() != destFile.length()) {
30             throw new IOException("Failed to copy full contents from '" +
31                     srcFile + "' to '" + destFile + "'");
32         }
33         if (preserveFileDate) {
34             destFile.setLastModified(srcFile.lastModified());
35         }
36     }

复制代码

由此可见,使用Apache Commons IO复制文件的原理就是上述第二种方法:使用FileChannel复制

四、使用Java7的Files类复制

如果你有一些经验在Java 7中你可能会知道,可以使用复制方法的Files类文件,从一个文件复制到另一个文件。 这是第四个方法的代码:

1 private static void copyFileUsingJava7Files(File source, File dest)
2         throws IOException {    
3         Files.copy(source.toPath(), dest.toPath());
4 }

五、测试

现在看到这些方法中的哪一个是更高效的,我们会复制一个大文件使用每一个在一个简单的程序。 从缓存来避免任何性能明显我们将使用四个不同的源文件和四种不同的目标文件。 让我们看一下代码:

复制代码

 1 import java.io.File;
 2 import java.io.FileInputStream;
 3 import java.io.FileOutputStream;
 4 import java.io.IOException;
 5 import java.io.InputStream;
 6 import java.io.OutputStream;
 7 import java.nio.channels.FileChannel;
 8 import java.nio.file.Files;
 9 import org.apache.commons.io.FileUtils;
10 
11 public class CopyFilesExample {
12 
13     public static void main(String[] args) throws InterruptedException,
14             IOException {
15 
16         File source = new File("C:\\Users\\nikos7\\Desktop\\files\\sourcefile1.txt");
17         File dest = new File("C:\\Users\\nikos7\\Desktop\\files\\destfile1.txt");
18 
19         // copy file using FileStreamslong start = System.nanoTime();
20         long end;
21         copyFileUsingFileStreams(source, dest);
22         System.out.println("Time taken by FileStreams Copy = "
23                 + (System.nanoTime() - start));
24 
25         // copy files using java.nio.FileChannelsource = new File("C:\\Users\\nikos7\\Desktop\\files\\sourcefile2.txt");
26         dest = new File("C:\\Users\\nikos7\\Desktop\\files\\destfile2.txt");
27         start = System.nanoTime();
28         copyFileUsingFileChannels(source, dest);
29         end = System.nanoTime();
30         System.out.println("Time taken by FileChannels Copy = " + (end - start));
31 
32         // copy file using Java 7 Files classsource = new File("C:\\Users\\nikos7\\Desktop\\files\\sourcefile3.txt");
33         dest = new File("C:\\Users\\nikos7\\Desktop\\files\\destfile3.txt");
34         start = System.nanoTime();
35         copyFileUsingJava7Files(source, dest);
36         end = System.nanoTime();
37         System.out.println("Time taken by Java7 Files Copy = " + (end - start));
38 
39         // copy files using apache commons iosource = new File("C:\\Users\\nikos7\\Desktop\\files\\sourcefile4.txt");
40         dest = new File("C:\\Users\\nikos7\\Desktop\\files\\destfile4.txt");
41         start = System.nanoTime();
42         copyFileUsingApacheCommonsIO(source, dest);
43         end = System.nanoTime();
44         System.out.println("Time taken by Apache Commons IO Copy = "
45                 + (end - start));
46 
47     }
48 
49     private static void copyFileUsingFileStreams(File source, File dest)
50             throws IOException {
51         InputStream input = null;
52         OutputStream output = null;
53         try {
54             input = new FileInputStream(source);
55             output = new FileOutputStream(dest);
56             byte[] buf = new byte[1024];
57             int bytesRead;
58             while ((bytesRead = input.read(buf)) > 0) {
59                 output.write(buf, 0, bytesRead);
60             }
61         } finally {
62             input.close();
63             output.close();
64         }
65     }
66 
67     private static void copyFileUsingFileChannels(File source, File dest)
68             throws IOException {
69         FileChannel inputChannel = null;
70         FileChannel outputChannel = null;
71         try {
72             inputChannel = new FileInputStream(source).getChannel();
73             outputChannel = new FileOutputStream(dest).getChannel();
74             outputChannel.transferFrom(inputChannel, 0, inputChannel.size());
75         } finally {
76             inputChannel.close();
77             outputChannel.close();
78         }
79     }
80 
81     private static void copyFileUsingJava7Files(File source, File dest)
82             throws IOException {
83         Files.copy(source.toPath(), dest.toPath());
84     }
85 
86     private static void copyFileUsingApacheCommonsIO(File source, File dest)
87             throws IOException {
88         FileUtils.copyFile(source, dest);
89     }
90 
91 }

复制代码

输出:

Time taken by FileStreams Copy = 127572360
Time taken by FileChannels Copy = 10449963
Time taken by Java7 Files Copy = 10808333
Time taken by Apache Commons IO Copy = 17971677

正如您可以看到的FileChannels拷贝大文件是最好的方法。如果你处理更大的文件,你会注意到一个更大的速度差。 这是一个示例,该示例演示了Java中四种不同的方法可以复制一个文件。

LCD1602驱动全解析:从初始化时序到HD44780控制器实战 在嵌入式系统开发中,液晶显示模块(LCD)是重要的人机交互界面,其驱动原理涉及微控制器(MCU)与外围设备的通信协议。理解控制器如何通过指令集管理显示存储器和字符发生器,是稳定驱动的关键。这项技术的核心价值在于实现可靠的数据可视化,广泛应用于智能仪表、工业控制和消费电子等领域。本文将聚焦于LCD1602模块及其HD44780控制器,深入探讨初始化流程中的时序要求与4位/8位模式抉择,并解析DDRAM地址映射、忙标志检查等常见问题,帮助开发者构建稳健的底层驱动。 阅读详情

相关推荐

CAPL编程的催化剂——CAPLdll的实现

CANoe作为一款功能强大的总线开发及测试工具,不仅仅是因为其丰富的库函数,最重要的是其兼容了多种编程语言,可以实现灵活的开发,极大的解决了纯CAPL编程所带来的限制,如通过动态链接库(DLL)来实现复杂函数的编写,使其能够在CAPL中可以调用,下面将对DLL的实现进行分析。capldll.cpp这个文件初看相当复杂,从整体上来说,这段代码主要包含了两部分:自定义函数实现和回调函数定义,今天的主要任务是实现自定义函数,这里的函数定义与普通函数定义差不多,只是利用了CAPL的格式。在VS2017工程中打开。

车载控制器AutoSAR软件开发工程师 4649

4种Java文件复制的方法

类是在 Java 1.4 中引入的,FileChannel 可用于在 java 中复制文件。根据transferFrom()方法 javadoc,这种复制文件的方式应该比使用 Streams 复制文件更快。这是可用于使用 FileChannel 复制文件的方法。这是可用于使用流的java复制文件的方法。如果您正在使用 Java 7 或更高版本,则可以使用Files类的copy()方法在 java 中复制文件。这是上面程序的输出,注意注释了上面的代码,以确保每次只使用一种方法进行 java 文件复制操作。

qq_30436011的博客 1万+

Oracle Linux中/var/log/pcp/pmlogger目录膨胀问题分析与解决

本文详细分析了Oracle Linux系统中/var/log/pcp/pmlogger目录异常膨胀的常见原因与解决方案。当PCP性能监控框架的pmlogger服务日志轮转或清理机制失效时,会导致该目录无限增长,威胁系统稳定。文章提供了从服务状态诊断、配置文件审查到安全清理与预防策略的全流程实战指南,帮助运维人员快速回收磁盘空间并恢复服务正常运行。

weixin_29208327的博客 378

Java文件复制多种方法

java文件复制的方法有几种方式

LookingTomorrow的博客 1万+

Qt 6.5实战:用QMediaPlayer搞定RTSP监控流播放(附LAV Filters解码器避坑指南)

本文详细介绍了如何在Qt 6.5中使用QMediaPlayer实现低延迟RTSP监控流播放,并提供了LAV Filters解码器的配置避坑指南。通过优化缓冲策略和硬件加速设置,显著提升视频流的播放性能和稳定性,适用于工业视觉检测和安防监控等实时场景。

weixin_33712987的博客 401

机器学习笔记——30种常见机器学习算法简要汇总

本笔记介绍机器学习中常见的30种机器学习算法。

haopinglianlian的博客 3200

Java NIO 本地零拷贝transferFrom、transferTo与Buffer拷贝

原理流程图 代码demo public static void main(String[] args) throws Exception { //拿到文件 File file = new File("d:\\test\\write.txt"); FileInputStream inputStream = new FileInputStream(file); //创建管道,把文件放入通道 FileChannel fileChannel = inputStream.ge

weixin_44371237的博客 1699

A*搜索算法在三维路径规划(避障)中的MATLAB实现与Python实现

A star algorithmA*搜索算法简介A*搜索算法的Python简化代码MATLAB实现启发函数回溯轨迹RRT算法对比A\*算法在三维路径规划中的一些不足 A*搜索算法简介 A*搜索算法是Greedy Best-First算法的改进,因为Greedy Best-First算法只考虑将预估距离(当前节点到目标点的预估距离)作为遴选开节点集的条件。即: priority=heuristic(goal,next)priority=heuristic(goal, next)priority=heurist

ZYunfei的博客 2万+

Java复制一个文件的内容到另一个文件的七种方法

Java复制一个文件的内容到另一个文件的七种方法

空山新雨后,天气晚来秋 1万+

uni-app - 刘海屏(Iphone X)底部横杠(——)白色区域块(安全距离处更改颜色)解决方案

场景:因为要做无tabbar页面,所以在配置文件中取消底部导航栏。取消后,iPhoneX(刘海屏)底部就出现如下图所示白色安全区域问题:这个问题,是因为uni-app默认会为iPhoneX(刘海屏)留出安全距离,这个安全距离的背景色就是白色。所以,如果你将页面颜色设置为其他颜色,就会与默认白色冲突。有2个不同的解决方案(原生占位),虽然原理是一样,但使用的场景不同,请根据您的需求来采纳。

🏆 前端领域优质创作者 1万+

【PCIe 总线及设备入门学习专栏 6.2 -- PCIe VDM (Vendor Defined Messages)】

在PCIe协议中,Vendor Defined Messages (VDMs) 是一种允许厂商定义和传输特定功能的消息类型。这种机制扩展了标准 PCIe 消息的功能,可以用于实现供应商自定义的功能,例如固件更新、设备配置和诊断信息传输。PCIe VDM 是通过实现的,它遵循 PCIe 协议栈的结构,包括事务层、数据链路层和物理层。

CodingCos的博客 1898

Java复制文件的4种方式

尽管Java提供了一个可以处理文件的IO操作类。 但是没有一个复制文件的方法。 复制文件是一个重要的操作,当你的程序必须处理很多文件相关的时候。 然而有几种方法可以进行Java文件复制操作,下面列举出4中最受欢迎的方式。 1. 使用FileStreams复制 这是最经典的方式将一个文件的内容复制到另一个文件中。 使用FileInputStream读取文件A的字节,使用FileOutp...

weixin_30294021的博客 102

IDEA的使用指南

IDEA基于java的使用手册,可以最快速的上手,在使用中不断的丰富自己的使用技巧.

java 复制文件_java复制文件的4种方式

一、使用FileStreams复制这是最经典的方式将一个文件的内容复制到另一个文件中。 使用FileInputStream读取文件A的字节,使用FileOutputStream写入到文件B。 这是第一个方法的代码:1 private static voidcopyFileUsingFileStreams(File source, File dest)2 throwsIOExcept...

weixin_30070339的博客 1483

数学建模模型总结

这是本人在两年内准备参加数学建模竞赛搜集到的模型资料,已经经过了本人的筛选和整理,希望能够对准备参加数学建模竞赛的学弟学妹们提供一些帮助!

华为的C语言编程规范.pdf

华为技术有限公司内部技术规范。本规范制定了编写C语言程序的基本原则、规则和建议。从代码的清晰、简洁、可测试、安全、程序效率、可移植各个方面对C语言编程作出了具体指导。

java中文件复制的4种方式

java中文件复制的4种方式 1. 使用FileStreams复制 比较经典的一个代码,使用FileInputStream读取文件A的字节,使用FileOutputStream写入到文件B。 public static void copy(String source, String dest, int bufferSize) { InputStream in = null; OutputStream out = null; try { in = new FileInp

weixin_43564627的博客 430

ET2012新版免狗免安装绿色软件

ET2012新版免狗免安祖昂绿色软件。,新界面,新视觉,

java怎么让代码复制文件_java复制文件的4种方式

1. 使用FileStreams复制这是最经典的方式将一个文件的内容复制到另一个文件中。使用FileInputStream读取文件A的字节,使用FileOutputStream写入到文件B。这是第一个方法的代码:private static void copyFileUsingFileStreams(File source, File dest)throws IOException {InputS...

weixin_29713915的博客 673

Java 复制文件代码_Java复制文件的4种方式

尽管Java提供了一个可以处理文件的IO操作类。 但是没有一个复制文件的方法。 复制文件是一个重要的操作,当你的程序必须处理很多文件相关的时候。 然而有几种方法可以进行Java文件复制操作,下面列举出4中最受欢迎的方式。1. 使用FileStreams复制这是最经典的方式将一个文件的内容复制到另一个文件中。 使用FileInputStream读取文件A的字节,使用FileOutputStream写...

weixin_35953861的博客 823
上一篇: java ppt转图片 解决图片不清晰问题,Java PowerPoint转图片,使用java操作ppt转图片
下一篇: logback的使用和logback.xml详解
ole_triangle_java
博客等级 码龄10年 82粉丝 83原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值