Java 文件复制
摘要
这是最经典的方式将一个文件的内容复制到另一个文件中。 使用FileInputStream读取文件A的字节,使用FileOutputStream写入到文件B。 这是第一个方法的代码:
public static void copyFileUsingFileStreams(File source,File dest)
throws IOException{
InputStream input = null;
OutputStream output = null;
try {
input = new FileInputStream(source);
output = new FileOutputStream(dest);
byte[] buf = new byte[1024];
int bytesRead;
while((bytesRead = input.read(buf)) > 0) {
output.write(buf,0,bytesRead);
}
}finally {
input.close();
output.close();
}
}
正如你所看到的我们执行几个读和写操作try的数据,所以这应该是一个低效率的,下一个方法我们将看到新的方式。
2. 使用FileChannel复制
Java NIO包括transferFrom方法,根据文档应该比文件流复制的速度更快。 这是第二种方法的代码:
-
private static void copyFileUsingFileChannels(File source, File dest) throws IOException {
-
FileChannel inputChannel = null;
-
FileChannel outputChannel = null;
-
try {
-
inputChannel = new FileInputStream(source).getChannel();
-
outputChannel = new FileOutputStream(dest).getChannel();
-
outputChannel.transferFrom(inputChannel, 0, inputChannel.size());
-
} finally {
-
inputChannel.close();
-
outputChannel.close();
-
}
-
}
3. 使用Commons IO复制
Apache Commons IO提供拷贝文件方法在其FileUtils类,可用于复制一个文件到另一个地方。它非常方便使用Apache Commons FileUtils类时,您已经使用您的项目。基本上,这个类使用Java NIO FileChannel内部。 这是第三种方法的代码:
-
private static void copyFileUsingApacheCommonsIO(File source, File dest)
-
throws IOException {
-
FileUtils.copyFile(source, dest);
-
}
4. 使用Java7的Files类复制
如果你有一些经验在Java 7中你可能会知道,可以使用复制方法的Files类文件,从一个文件复制到另一个文件。 这是第四个方法的代码:
-
private static void copyFileUsingJava7Files(File source, File dest)
-
throws IOException {
-
Files.copy(source.toPath(), dest.toPath());
-
}
5. 测试
现在看到这些方法中的哪一个是更高效的,我们会复制一个大文件使用每一个在一个简单的程序。 从缓存来避免任何性能明显我们将使用四个不同的源文件和四种不同的目标文件。 让我们看一下代码:
-
import java.io.File;
-
import java.io.FileInputStream;
-
import java.io.FileOutputStream;
-
import java.io.IOException;
-
import java.io.InputStream;
-
import java.io.OutputStream;
-
import java.nio.channels.FileChannel;
-
import java.nio.file.Files;
-
import org.apache.commons.io.FileUtils;
-
-
public class CopyFilesExample {
-
-
public static void main(String[] args) throws InterruptedException,
-
IOException {
-
-
File source = new File("C:\\Users\\nikos7\\Desktop\\files\\sourcefile1.txt");
-
File dest = new File("C:\\Users\\nikos7\\Desktop\\files\\destfile1.txt");
-
-
// copy file using FileStreamslong start = System.nanoTime();
-
long end;
-
copyFileUsingFileStreams(source, dest);
-
System.out.println( "Time taken by FileStreams Copy = "
-
+ (System.nanoTime() - start));
-
-
// copy files using java.nio.FileChannelsource = new File("C:\\Users\\nikos7\\Desktop\\files\\sourcefile2.txt");
-
dest = new File("C:\\Users\\nikos7\\Desktop\\files\\destfile2.txt");
-
start = System.nanoTime();
-
copyFileUsingFileChannels(source, dest);
-
end = System.nanoTime();
-
System.out.println( "Time taken by FileChannels Copy = " + (end - start));
-
-
// copy file using Java 7 Files classsource = new File("C:\\Users\\nikos7\\Desktop\\files\\sourcefile3.txt");
-
dest = new File("C:\\Users\\nikos7\\Desktop\\files\\destfile3.txt");
-
start = System.nanoTime();
-
copyFileUsingJava7Files(source, dest);
-
end = System.nanoTime();
-
System.out.println( "Time taken by Java7 Files Copy = " + (end - start));
-
-
// copy files using apache commons iosource = new File("C:\\Users\\nikos7\\Desktop\\files\\sourcefile4.txt");
-
dest = new File("C:\\Users\\nikos7\\Desktop\\files\\destfile4.txt");
-
start = System.nanoTime();
-
copyFileUsingApacheCommonsIO(source, dest);
-
end = System.nanoTime();
-
System.out.println( "Time taken by Apache Commons IO Copy = "
-
+ (end - start));
-
-
}
-
-
private static void copyFileUsingFileStreams(File source, File dest)
-
throws IOException {
-
InputStream input = null;
-
OutputStream output = null;
-
try {
-
input = new FileInputStream(source);
-
output = new FileOutputStream(dest);
-
byte[] buf = new byte[1024];
-
int bytesRead;
-
while ((bytesRead = input.read(buf)) > 0) {
-
output.write(buf, 0, bytesRead);
-
}
-
} finally {
-
input.close();
-
output.close();
-
}
-
}
-
-
private static void copyFileUsingFileChannels(File source, File dest)
-
throws IOException {
-
FileChannel inputChannel = null;
-
FileChannel outputChannel = null;
-
try {
-
inputChannel = new FileInputStream(source).getChannel();
-
outputChannel = new FileOutputStream(dest).getChannel();
-
outputChannel.transferFrom(inputChannel, 0, inputChannel.size());
-
} finally {
-
inputChannel.close();
-
outputChannel.close();
-
}
-
}
-
-
private static void copyFileUsingJava7Files(File source, File dest)
-
throws IOException {
-
Files.copy(source.toPath(), dest.toPath());
-
}
-
-
private static void copyFileUsingApacheCommonsIO(File source, File dest)
-
throws IOException {
-
FileUtils.copyFile(source, dest);
-
}
-
-
}
输出:
-
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中四种不同的方法可以复制一个文件。

低调大师中文资讯倾力打造互联网数据资讯、行业资源、电子商务、移动互联网、网络营销平台。
持续更新报道IT业界、互联网、市场资讯、驱动更新,是最及时权威的产业资讯及硬件资讯报道平台。
转载内容版权归作者及来源网站所有,本站原创内容转载请注明来源。
-
上一篇
最全Python内置函数
内置函数的基本使用 abs的使用: 取绝对值 1 absprint(abs(123))print(abs(-123))result:123123 all的使用: 循环参数,如果每个元素都为真的情况下,那么all的返回值为True: 假: 0, None, "", [],(), {} ret = all([True, True]) ret1 = all([True, False]) result: True False any的使用: 只要有一个为True,则全部为True ret = any(None, "", []) ret1 = any(None, "", 1) result: False True ascii的使用: 回去对象的类中,找到__repr__方法,找到该方法之后获取返回值 class Foo: def __repr__(self): return "hello" obj = Foo() ret = ascii(obj ) 自动去对象(类)中找到 __repr__方法获取其返回值 bin的使用: 二进制 ret = bin(11) result: 0b1011 oct的...
-
下一篇
Java 目录和文件的复制
1.复制一个目录及其子目录、文件到另外一个目录 //复制一个目录及其子目录、文件到另外一个目录 public void copyFolder(File src, File dest) throws IOException { if (src.isDirectory()) { if (!dest.exists()) { dest.mkdir(); } String files[] = src.list(); for (String file : files) { File srcFile = new File(src, file); File destFile = new File(dest, file); // 递归复制 copyFolder(srcFile, destFile); } } else { InputStream in = new FileInputStream(src); OutputStream out = new FileOutputStream(dest); byte[] buffer = new byte[1024]; i...
相关文章
文章评论
共有0条评论来说两句吧...
文章二维码
点击排行
推荐阅读
最新文章
- CentOS8,CentOS7,CentOS6编译安装Redis5.0.7
- Docker使用Oracle官方镜像安装(12C,18C,19C)
- SpringBoot2全家桶,快速入门学习开发网站教程
- Springboot2将连接池hikari替换为druid,体验最强大的数据库连接池
- SpringBoot2编写第一个Controller,响应你的http请求并返回结果
- SpringBoot2整合Redis,开启缓存,提高访问速度
- MySQL8.0.19开启GTID主从同步CentOS8
- SpringBoot2更换Tomcat为Jetty,小型站点的福音
- CentOS7,8上快速安装Gitea,搭建Git服务器
- Dcoker安装(在线仓库),最新的服务器搭配容器使用