深入JavaIO和Google GuavaIO文件复制性能小测
来源:互联网 发布:sql 查询某个字段包含 编辑:程序博客网 时间:2024/05/21 06:39
本人菜鸟,今天写了一些IO的测试,贴出来与大家共勉,有不同看法的欢迎指出,我也会亲自测试改进,谢谢!
先贴出3个方法的代码,后面再总结下...
首先写的是java原生的IO复制代码,用FileInputStream和FileOutputStream来复制文件,代码如下:
public long testIOCopy(File in,File out) throws Exception{//986
Date begin = new Date();
FileInputStream fis = new FileInputStream(in);
FileOutputStream fos = new FileOutputStream(out);
byte[] b = new byte[1024*50];//回根据每次读的大小,性能有所改观
fis.read(b ); //[1024] 580
fis.read(b ); //[1024*10] 150
fis.read(b ); //[1024*50] 80
int i;
while((i = fis.read(b)) != -1){
fos.write(b);
}
fos.close();
fis.close();
Date end = new Date();
return end.getTime() - begin.getTime();
}
下面也是用了javaIO,不过是用了FileChannel文件通道来实现复制,代码如下:
public long testFileChannel(File in,File out) throws Exception{//94 32
Date begin = new Date();
FileInputStream fis = new FileInputStream(in);
FileOutputStream fos = new FileOutputStream(out);
FileChannel inChannel = fis.getChannel();
FileChannel outChannel = fos.getChannel();
inChannel.transferTo(0, inChannel.size(), outChannel);
outChannel.close();
inChannel.close();
fos.close();
fis.close();
Date end = new Date();
return end.getTime() - begin.getTime();
}
最后是用Google Guava提供的Files类的copy实现,代码:
public long testGuavaIO(File in,File out) throws Exception{//2230
Date begin = new Date();
Files.copy(in, out);
Date end = new Date();
return end.getTime() - begin.getTime();
}
最后总结:我是用的一个QQ的安装文件(大小为55M多)来测试的,. 3个方法,在首次运行时,时间都相比后面运行时长,总的来说,用FileChannel时间相对比较少,在50毫秒左右,而Guava的copy用时在200-280之间,但他的代码最简洁,也不用我们来手动关闭流,后面会贴出Guava的源码,java原生的FileInputStream和FileOutputStream,在根据每次读取的字节大小,性能有所提升,上面的代码中也贴了根据每次读取大小的用时长短,
Guava的源码:
public static void copy(File from, File to) throws IOException {
checkArgument(!from.equals(to),
"Source %s and destination %s must be different", from, to);
asByteSource(from).copyTo(asByteSink(to));
}
public long copyTo(ByteSink sink) throws IOException {
checkNotNull(sink);
Closer closer = Closer.create();
try {
InputStream in = closer.register(openStream());
OutputStream out = closer.register(sink.openStream());
return ByteStreams.copy(in, out);
} catch (Throwable e) {
throw closer.rethrow(e);
} finally {
closer.close();
}
}
以上是自己亲测,如大家还有更多更好的方法,欢迎讨论!
- 深入JavaIO和Google GuavaIO文件复制性能小测
- JavaIO之高效文件复制操作
- javaIO关于文件操作(读取,写入,复制,遍历所有文件)
- JavaIO操作实现文件复制与名称修改
- javaIO之文本复制
- JavaIO之复制目录
- 深入理解JavaIO流
- NodeJS 小文件复制
- JavaIO流--创建文件和文件夹的程序实例
- JavaIO 总结笔记<二> IO简介和File文件
- 提高文件复制的性能
- 更正--提高文件复制性能
- javaIO流之字节流的四种方式复制文件方式总结
- javaIo——运用字节流完整复制文件夹及文件
- JavaIO操作-拷贝文件
- javaio文件操作
- linux大量小文件复制
- JAVA文件复制小程序
- 银行储蓄系统
- hiho一下 第五十四周 题目1 : 连通性·三
- 《Spring技术内幕》学习笔记6——IoC容器的高级特性
- UICollectionview实现类似UITableview的sectionheader悬浮代码
- Spring基于 Annotation 的简单介绍
- 深入JavaIO和Google GuavaIO文件复制性能小测
- 编译并使用Boost库(Win7+Boost1.53+VS2012)
- PAT (Basic Level) Practise (中文)1009. 说反话 (20)
- 深搜专题初步-1001
- Spring对注解(Annotation)处理源码分析1——扫描和读取Bean定义
- jconsole入门介绍
- VS出现运行对话框程序 pThread->m_pMainWnd->DestroyWindow(); 错误
- Java,php,python,js 定义多行字符串
- Tomcat日志系统详解