首页 > 代码库 > java流的性能优化1-文件复制
java流的性能优化1-文件复制
传统的I/O速度相对比较慢,它会成为系统性能的瓶颈,所以在java1.4之后提供了NIO,它是一种全新的流:它具有以下特性:
1.为所有的原是类型提供Buffer缓存支持;
2.使用java.nio.charset.Charset作为字符编码解码解决方案;
3.增加通道(Channel)对象,作为新的原始I/O抽象;
4.支持锁和内存映射文件的文件访问接口;
5.提供基于Selector的异步网络I/O;
NIO是一种全新的流,跟流式的I/O不同,NIO是基于块的,它以块为基本单位处理数据。在NIO中,最为重要的两个组件是缓冲Buffer和通道Channel。如图这是他们指甲的关系
从上图的关系看来,Channel是一个双向的通道,即可读又可以写。
现在,从性能上来比较一下io和Nio的性能差异吧,这是一个文件复制的例子,文件大小均为152m,缓存设置成1m:
public class CopyFile { public static void main(String args[]) { String path = "E:\\temp_nio.tmp"; String new_path = "E:\\demo\\nio.tmp"; long start = System.currentTimeMillis(); NioCopy(path, new_path); long end = System.currentTimeMillis(); System.out.println("Nio复制文件执行时间:"+(end-start)); path="E:\\temp_cache_tmp"; new_path="E:\\demo\\temp_cache_tmp"; start = System.currentTimeMillis(); IoCopy(path, new_path); end = System.currentTimeMillis(); System.out.println("Io复制文件执行时间:"+(end-start)); } /* * Nio复制文件 */ public static void NioCopy(String path, String new_path) { try (FileInputStream fis = new FileInputStream(new File(path)); FileOutputStream fos = new FileOutputStream(new File(new_path)); FileChannel fisChannel = fis.getChannel(); FileChannel fosChannel = fos.getChannel();) { ByteBuffer buffer = ByteBuffer.allocate(1024); while (true) { buffer.clear(); int len = fisChannel.read(buffer); if (len == -1) { break; } buffer.flip(); fosChannel.write(buffer); } } catch (Exception e) { // TODO: handle exception e.printStackTrace(); } } /* * io复制文件 */ public static void IoCopy(String path, String new_path) { try (FileInputStream fis = new FileInputStream(new File(path)); FileOutputStream fos = new FileOutputStream(new File(new_path));) { byte buffer[] = new byte[1024]; while ((fis.read(buffer)) != -1) { fos.write(buffer); } } catch (Exception e) { // TODO: handle exception e.printStackTrace(); } } }
执行时间的效率上还是会有差距的,其实我们可以根据设置缓存的大小来加快两者执行的效率,当然从理论上来说缓存设置得越大越好,这样读取速度会非常的快,但是从实际的角度来说,这个是有很大的问题,他会让你服务器的内存耗光,让你的gc收集次数加多,所以不同的环境下可以根据自己的情况设置缓存,我设置的是10m,如下图所示,效率提高很多,但是舍去的是大量的内存,其实也可以通过优化jvm的方式来提高一些系统的效率,这个我就不多说了。
声明:以上内容来自用户投稿及互联网公开渠道收集整理发布,本网站不拥有所有权,未作人工编辑处理,也不承担相关法律责任,若内容有误或涉及侵权可进行投诉: 投诉/举报 工作人员会在5个工作日内联系你,一经查实,本站将立刻删除涉嫌侵权内容。