java sha-1 文件 耗时_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。

如图这是他们指甲的关系

java sha-1 文件 耗时_java流的性能优化1-文件复制_第1张图片

从上图的关系看来。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();

}

}

}

java sha-1 文件 耗时_java流的性能优化1-文件复制_第2张图片

运行时间的效率上还是会有差距的,事实上我们能够依据设置缓存的大小来加快两者运行的效率。当然从理论上来说缓存设置得越大越好。这样读取速度会非常的快。可是从实际的角度来说。这个是有非常大的问题,他会让你server的内存耗光。让你的gc收集次数加多。所以不同的环境下能够依据自己的情况设置缓存,我设置的是10m,例如以下图所看到的,效率提高非常多。可是舍去的是大量的内存,事实上也能够通过优化jvm的方式来提高一些系统的效率,这个我就不多说了。

java sha-1 文件 耗时_java流的性能优化1-文件复制_第3张图片

你可能感兴趣的:(java,sha-1,文件,耗时)