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

最新文章

  1. 20155324王鸣宇对C语言课程回顾及对Java的展望
  2. hibernate学习(5)——多对多关系映射
  3. C#关于winforms窗体大小、边框、移动、动画等属性
  4. Collection、Iterator、Set、HashSet
  5. php实现一致性哈希算法
  6. Windows 下如何设置 只允许固定IP远程访问
  7. dtcms,header显示头像和用户名,QQ互联老不通过的解决方法
  8. 使用AutoMapper
  9. redis安装方法
  10. Drying(贪心)
  11. MySql基础总结
  12. Cookie的简单用法
  13. mysql常用脚本及命令记录
  14. mysql5.6版本备份报错
  15. Java正则表达式应用
  16. matplotlib-区域填充
  17. /etc/shadow中密码段的生成方式
  18. Using a ScrollView - RN4
  19. 6J - 盐水的故事
  20. 版本控制工具Git工具快速入门-Windows篇

热门文章

  1. 组队赛第二场:字符串哈希+DP
  2. Java中对不变的 data和object reference 使用 final
  3. cocoapod安装失败解决
  4. java读取XML文件的四种方式
  5. 成为JAVA软件开发工程师要学哪些东西
  6. hdu 5187 高速幂高速乘法
  7. Oracle语句集锦
  8. HTTP真的很简单(转)
  9. 设计模式初探3——装饰者模式(Decorator Pattern)
  10. Java的wait(), notify()和notifyAll()使用心得(转)