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,有时候可能是一些基础类型的值.在拼接字符串的时候,如果你有两个或者多个基础类型的值需要放到前面,你需要显式的将第一个值 ...
随机推荐
- NTFS权限设置时卡死
客户是一家技术咨询和零部件制造的小公司,使用的文件服务器为R410上插4块1T硬盘做raid 5,服务器操作系统为windows server 2008R2,所有的设计资料的授权都是结合域账户和NTF ...
- 《WordPress插件开发手冊》文件夹
翻译前言:国内没有关于WordPress插件开发比較具体而且系统的资料 前言 第一章:准备一个本地开发环境 介绍 在你的电脑上安装一个站点server 下载并配置一个本地的WordPress 创建一个 ...
- JS类定义方式
// 方法1 对象直接量 var obj1 = { v1 : "", get_v1 : function() { return this.v1; }, set_v1 : funct ...
- 队列优化和斜率优化的dp
可以用队列优化或斜率优化的dp这一类的问题为 1D/1D一类问题 即状态数是O(n),决策数也是O(n) 单调队列优化 我们来看这样一个问题:一个含有n项的数列(n<=2000000),求出每一 ...
- 两种Data Table参数化设置的区别
首先介绍Data Table的语法: 1.DataTable.value(ParameterID, SheetID) 2.DataTable(ParameterID, SheetID) 以上2种方法的 ...
- hbase列表排序
hbase都是依照字典序进行排序的,也就是降序,在页面的表现就是最早的数据(rowkey最小的)排在前面. 眼下的解决方式是:给主键添加一个外键关联表.外键的生成规则是 400000000000-主键 ...
- Vb.net/VB 声明API功能父窗口功能
回想第一次敲房费,他说自己是api函数实现父窗口及其子窗口最小化的功能.现在再次遇到,自己就在思考,能不能继续使用API函数呢?答案当然是Of Course! 事实上细致看两者并没有多大的差别,先看看 ...
- Core 1.0中的管道-中间件模式
ASP.NET Core 1.0中的管道-中间件模式 SP.NET Core 1.0借鉴了Katana项目的管道设计(Pipeline).日志记录.用户认证.MVC等模块都以中间件(Middlewar ...
- Visibility属性实现自动隐藏功能
//使用一个Button,鼠标移入listView显示,移出隐藏 private void button2_MouseEnter(object sender, System.Windows.Input ...
- 小米2S Mk6.0.1 [只能做测试体验,不能使用]
上几张高清图片.. 说明: 此版本只能做测试体验,不能做实际使用. 开发者: laser杨万荣 感谢: 秋叶随风ivan, m1cha 及 MoKee Open Source的各位开发者 下载地址:链 ...