传统的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. ios UITableView 相关

    1.tableView 实现的方法 无分组的cell #pragma mark - Table view data source - (NSInteger)tableView:(UITableView ...

  2. pygame系列_游戏中的事件

    先看一下我做的demo: 当玩家按下键盘上的:上,下,左,右键的时候,后台会打印出玩家所按键的数字值,而图形会随之移动 这是客观上面存在的现象. 那么啥是事件呢? 你叫我做出定义,我不知道,我只能举个 ...

  3. 从零开始学Xamarin.Forms(五) 技巧

    原文:从零开始学Xamarin.Forms(五) 技巧 由于HTML5规范于2014年10月终于定稿,公司.net开发人员较少,国内外已有了较为成熟的UI框架.手机软件硬件的快速发展等等原因,所以我就 ...

  4. Java线程中断的本质深入理解(转)

    一.Java中断的现象 首先,看看Thread类里的几个方法: public static boolean interrupted 测试当前线程是否已经中断.线程的中断状态 由该方法清除.换句话说,如 ...

  5. Codeforces Round #256 (Div. 2) D. Multiplication Table(二进制搜索)

    转载请注明出处:viewmode=contents" target="_blank">http://blog.csdn.net/u012860063?viewmod ...

  6. HDU4309-Seikimatsu Occult Tonneru(最大流)

    Seikimatsu Occult Tonneru Time Limit: 12000/6000 MS (Java/Others)    Memory Limit: 32768/32768 K (Ja ...

  7. mysql寻呼最快

    大家都知道,mysql分页写: select * from 'yourtable' limit start,rows 如今我数据库一张表里面有9969W条数据.表名叫tweet_data select ...

  8. Unity UGUI——开源

    开源许可证:MIT/X11 来源托管网站:BitBucket

  9. 【剑指offer】q50:树节点最近的祖先

    #@ root: the root of searched tree #@ nodeToFind: the tree-node to be found #@ path: the path from r ...

  10. Eclipse 在线安装fat jar插件

    在线安装步骤: eclipse菜单栏 help >software updates >Search for new features to install>new update si ...