传统的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的方式来提高一些系统的效率,这个我就不多说了。

java流的性能优化1-文件复制的更多相关文章

  1. Java服务端性能优化

    <Java程序性能优化>说性能优化包含五个层次:设计调优.代码调优.JVM调优.数据库调优.操作系统调优. 常用的几个代码优化方案: 使用单例 对于IO处理.数据库连接.配置文件解析加载等 ...

  2. java反射之-性能优化

    在最近的计划中,打算看看在不使用google protobuf的情况下,在原有的采用jackson作为json序列化工具的基础上,是否可以实现进一步的性能优化.主要是针对list的情况. 测试的时候选 ...

  3. 人人都能掌握的Java服务端性能优化方案

    作为一个Java后端开发,我们写出的大部分代码都决定着用户的使用体验.如果我们的后端代码性能不好,那么用户在访问我们的网站时就要浪费一些时间等待服务器的响应.这就可能导致用户投诉甚至用户的流失. 关于 ...

  4. 基于Java语言的IO操作(文件复制)

    public static void main(String[] args) { //获取复制开始前系统时间毫秒值 long start=System.currentTimeMillis(); //文 ...

  5. Java开发代码性能优化总结

    代码优化,可能说起来一些人觉得没用.可是我觉得应该平时开发过程中,就尽量要求自己,养成良好习惯,一个个小的优化点,积攒起来绝对是有大幅度效率提升的.好了,将平时看到用到总结的分享给大家. 代码优化的目 ...

  6. java反射机制性能优化

    import java.lang.reflect.InvocationTargetException; import java.lang.reflect.Method; import java.uti ...

  7. Java编程代码性能优化总结

    如果有足够的时间开发.维护代码,这时候就必须考虑每个可以优化的细节了,一个一个细小的优化点累积起来,对于代码的运行效率绝对是有提升的. 代码优化的目标是: 1.减小代码的体积 2.提高代码运行的效率 ...

  8. java IO(二)大文件复制

    package cn.sasa.demo3; import java.io.FileInputStream; import java.io.FileOutputStream; import java. ...

  9. Java字符串之性能优化

    基础类型转化成String 在程序中你可能时常会需要将别的类型转化成String,有时候可能是一些基础类型的值.在拼接字符串的时候,如果你有两个或者多个基础类型的值需要放到前面,你需要显式的将第一个值 ...

随机推荐

  1. linux开机启动服务和chkconfig使用方法(转)

    每个被chkconfig 管理的服务需要在对应的/etc/rc.d/init.d 下的脚本加上两行或者更多行的注释. 第一行告诉 chkconfig 缺省启动的运行级以及启动和停止的优先级.如果某服务 ...

  2. poj3468(线段树)

    题目连接:http://poj.org/problem?id=3468 线段树功能:update:成段增减 query:区间求和. 分析:需要用到延迟标记(或者说懒惰标记),简单来说就是每次更新的时候 ...

  3. Android FragmentStatePageAdapter的使用Demo

    上一篇写过FragmentPagerAdapter,这篇来介绍FragmentStatePagerAdapter,那么两者之间有何差别呢: FragmentPagerAdapter很多其它的用于少量界 ...

  4. Scala的XML操作

     8.  XML 8.1.     生成 Scala原生支持xml,就如同Java支持String一样,这就让生成xml和xhtml非常easy优雅: val name = "james ...

  5. Android - 位置定位(Location)服务(Service)类的基本操作

    位置定位(Location)服务(Service)类的基本操作 本文地址: http://blog.csdn.net/caroline_wendy 定位服务(Location Service),能够确 ...

  6. Source not found for StandardEngine(ContainerBase).initInternal() line: 1078

    总是这样 在复制完一个项目,并重新起了个名字后. 再打开网页就怎么也打开不了.   第一反应是tomcat出问题了. 于是有了这样的问题: Source not found for StandardE ...

  7. Android-它们的定义Notification

    Android-它们的定义Notification 2014年4月26日  消息栏的消息,想必各位Android发烧友非常清楚知道是什么,比方我们下载了一个应用,它可能会定时推送些消息到我们的手机中. ...

  8. 划分树 静态第k大

    划分树是保存了快速排序的过程的树,可以用来求静态第k小的数 如果,划分树可以看做是线段树,它的左孩子保存了mid-L+1 个 小于等于 a[mid] 的数字,  右孩子保存了 R-mid个大于等于a[ ...

  9. JDK1.8源码分析之HashMap(一) (转)

    一.前言 在分析jdk1.8后的HashMap源码时,发现网上好多分析都是基于之前的jdk,而Java8的HashMap对之前做了较大的优化,其中最重要的一个优化就是桶中的元素不再唯一按照链表组合,也 ...

  10. 简介支持向量机热门(认识SVM三位置)

    支持向量机通俗导论(理解SVM的三层境地) 作者:July .致谢:pluskid.白石.JerryLead.出处:结构之法算法之道blog. 前言 动笔写这个支持向量机(support vector ...