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的方式来提高一些系统的效率,这个我就不多说了。
java流的性能优化1-文件复制的更多相关文章
- Java服务端性能优化
<Java程序性能优化>说性能优化包含五个层次:设计调优.代码调优.JVM调优.数据库调优.操作系统调优. 常用的几个代码优化方案: 使用单例 对于IO处理.数据库连接.配置文件解析加载等 ...
- java反射之-性能优化
在最近的计划中,打算看看在不使用google protobuf的情况下,在原有的采用jackson作为json序列化工具的基础上,是否可以实现进一步的性能优化.主要是针对list的情况. 测试的时候选 ...
- 人人都能掌握的Java服务端性能优化方案
作为一个Java后端开发,我们写出的大部分代码都决定着用户的使用体验.如果我们的后端代码性能不好,那么用户在访问我们的网站时就要浪费一些时间等待服务器的响应.这就可能导致用户投诉甚至用户的流失. 关于 ...
- 基于Java语言的IO操作(文件复制)
public static void main(String[] args) { //获取复制开始前系统时间毫秒值 long start=System.currentTimeMillis(); //文 ...
- Java开发代码性能优化总结
代码优化,可能说起来一些人觉得没用.可是我觉得应该平时开发过程中,就尽量要求自己,养成良好习惯,一个个小的优化点,积攒起来绝对是有大幅度效率提升的.好了,将平时看到用到总结的分享给大家. 代码优化的目 ...
- java反射机制性能优化
import java.lang.reflect.InvocationTargetException; import java.lang.reflect.Method; import java.uti ...
- Java编程代码性能优化总结
如果有足够的时间开发.维护代码,这时候就必须考虑每个可以优化的细节了,一个一个细小的优化点累积起来,对于代码的运行效率绝对是有提升的. 代码优化的目标是: 1.减小代码的体积 2.提高代码运行的效率 ...
- java IO(二)大文件复制
package cn.sasa.demo3; import java.io.FileInputStream; import java.io.FileOutputStream; import java. ...
- Java字符串之性能优化
基础类型转化成String 在程序中你可能时常会需要将别的类型转化成String,有时候可能是一些基础类型的值.在拼接字符串的时候,如果你有两个或者多个基础类型的值需要放到前面,你需要显式的将第一个值 ...
随机推荐
- MBR格式无法识别2T以上的硬盘的问题
早上有人打电话说四块2T的sata 硬盘做了raid 5之后安装window server 2012的时候,无法创建分区,安装完系统后无法给剩余的硬盘创建分区,刚开始的时候我还以为是别人分区的数量问题 ...
- Net分布式系统
Net分布式系统 Net分布式系统之三:Keepalived+LVS+Nginx负载均衡之高可用 摘要: 上一篇写了nginx负载均衡,此篇实现高可用(HA).系统整体设计是采用Nginx做负载均衡, ...
- 阅读zepto.js的core中的Core methods
学习zepto.js,參考资料:http://www.zeptojs.cn/ 跟jQuery一样.其选择符号也是$; 首先接触的是 $.() 选择 $(selector, [context]) ⇒ ...
- Java--调试--单步调试,断言,单元测试
单步调试:主要查看变量内容的变化 1.设置断点位置,设置在可能出现问题的代码 2.以Debug as方式运行 程序 3.F5 --> step into 进入方法内部进行调试 F6 ...
- 原创教程“ActionScript3.0游戏中的图像编程”開始连载啦!
经过近两年的不懈努力,笔者的原创教程"ActionScript3游戏中的图像编程"最终在今日划上了完美的句号!这其中记录着笔者多年来在游戏制作,尤其是其中图像处理方 ...
- 编C语言单元测试框架CUnit方法库
/********************************************************************* * Author : Samson * Date ...
- POJ1300(欧拉回路)
Door Man Time Limit: 1000MS Memory Limit: 10000K Total Submissions: 2139 Accepted: 858 Descripti ...
- Naive Bayes Classification
Maching Learning QQ群:2 请说明来自csdn 微信:soledede
- linux下Ftp环境的搭建
Ftp环境的搭建 1.ftp软件的安装 使用ssh远程连接linux系统,上传和下载一些文件,Ftp是不可少的 Ftp的安装很简单,远程登录系统后使用命令 yum list vsftpd 通过提示 ...
- ASP.NET 应用程序生命周期
1.请求到达IIS服务器,IIS根据文件后缀找到对应的ISAPI(Internet Server API)扩展来处理,这个配置可在网站属性里的“根目录”选项卡中的“配置”里看到.可以看到,ashx.a ...