Java IO :拷贝文件的四种方式

尽管Java提供了可以操作文件的类java.io.File,但是没有一个把一个文件拷贝到另一个文件的专门的copy方法。当你在对文件进行一些相关操作的时候,copy是很常见的一种行为。这样,我们看看Java的几种copy方式:

代码如下所示: <!-- lang:java -->

// 1:使用FileStreams进行copy
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[] buff = new byte[1024];
		int byteRead;
		while ((byteRead = input.read(buff)) > 0) {
			output.write(buff, 0, byteRead);
		}
	} finally {
		input.close();
		output.close();
	}
}

// 2:使用java.nio.channels.FileChannel拷贝文件
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:使用Apache Commons IO拷贝文件
private static void copyFileUsingApacheCommonsIO(File source, File dest)
		throws IOException {
	FileUtils.copyFile(source, dest);// 包括文件夹和文件以及URL等方式,按照具体情况选择
}

// 4:使用Java7文件类拷贝文件
private static void copyFileUsingJava7Files(File source, File dest)
		throws IOException {
	Files.copy(source.toPath(), dest.toPath());
}

分析: 第一种方式:传统的文件流方式,当处理大数据量的文件读写的时候,性能比较差 第二种方式:NIO 的Channel 比传统的文件流方式要快 第三种方式: Apache Commons IO,代码简洁,使用方便,而且内部原理也是NIO实现的 第四种方式:Java 7的Files类,同样效果不错。

案例测试: <!-- lang:java --> public static void main(String[] args) throws IOException { File source = new File("C:\Users\bin\Desktop\sudojs\book.rar"); File dest = new File("C:\Users\bin\Desktop\sudojs\destfile1.rar");

	// 使用FileStreams拷贝
	long start = System.nanoTime();
	copyFileUsingFileStreams(source, dest);
	long end = System.nanoTime();
	System.out.println("使用FileStreams 拷贝文件耗费的时间 = " + (end - start));

	// 使用java.nio.FileChannel拷贝
	// source = new File("C:\\Users\\bin\\Desktop\\sudojs\\nodejs.pdf");
	dest = new File("C:\\Users\\bin\\Desktop\\sudojs\\destfile2.rar");
	start = System.nanoTime();
	copyFileUsingFileChannels(source, dest);
	end = System.nanoTime();
	System.out.println("使用java.nio.FileChannel 拷贝文件耗费的时间 = "
			+ (end - start));

	// 使用Java 7 Files类进行拷贝
	// source = new File("C:\\Users\\bin\\Desktop\\sudojs\\nodejs.pdf");
	dest = new File("C:\\Users\\bin\\Desktop\\sudojs\\destfile3.rar");
	start = System.nanoTime();
	copyFileUsingFileChannels(source, dest);
	end = System.nanoTime();
	System.out.println("使用Java 7 Files拷贝文件耗费的时间 = " + (end - start));

	// 使用commons io拷贝文件
	// source = new File("C:\\Users\\bin\\Desktop\\sudojs\\nodejs.pdf");
	dest = new File("C:\\Users\\bin\\Desktop\\sudojs\\destfile4.rar");
	start = System.nanoTime();
	copyFileUsingFileChannels(source, dest);
	end = System.nanoTime();
	System.out.println("使用commons io拷贝文件耗费的时间 = " + (end - start));
}

输出结果 使用FileStreams 拷贝文件耗费的时间 = 118337822492 使用java.nio.FileChannel 拷贝文件耗费的时间 = 74341638792 使用Java 7 Files拷贝文件耗费的时间 = 77163306057 使用commons io拷贝文件耗费的时间 = 68317497911

使用的文件大小如下图: 文件大小

文件大小为1.73G左右(还不算太大,大点效果更明显 ),那么根据测试结果发现:Commons IO最快,其次是NIO的Channel,然后是Java7的Files,最差的是FileStreams。当然具体的使用要根据具体情况安排,这里只做一个参考。

转载于:https://my.oschina.net/sudojs/blog/288641

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值