zoukankan      html  css  js  c++  java
  • 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();
    		}
    
    	}
    }
    

    运行时间的效率上还是会有差距的,事实上我们能够依据设置缓存的大小来加快两者运行的效率,当然从理论上来说缓存设置得越大越好,这样读取速度会非常的快,可是从实际的角度来说,这个是有非常大的问题,他会让你server的内存耗光,让你的gc收集次数加多,所以不同的环境下能够依据自己的情况设置缓存,我设置的是10m,例如以下图所看到的,效率提高非常多,可是舍去的是大量的内存,事实上也能够通过优化jvm的方式来提高一些系统的效率,这个我就不多说了。


  • 相关阅读:
    txt文件按行处理工具类(可以截取小说、分析日志等)【我】
    java正则表达式取出匹配字符串
    svn客户端更改用户名
    Spring集成MyBatis完整示例
    redis的list取出数据方式速度测试
    处理大量数据的性能优化一例【我】
    unity3d结合轮廓显示,实现完整的框选目标(附Demo代码)
    Unity3dPro 和免费版的区别
    unity3d 射线扫描 忽略图层
    Unity3D角色攻击范围判定和攻击判定
  • 原文地址:https://www.cnblogs.com/mfrbuaa/p/4021057.html
Copyright © 2011-2022 走看看