目前Java中最IO有多种文件读取的方法,本文章对比Stream,NIO ByteBuffer,NIO MappedByteBuffer的性能,让我们知道到底怎么能写出性能高的文件读取代码。

package com.seeyon.nio;

import org.junit.Test;

import java.io.*;
import java.nio.ByteBuffer;
import java.nio.MappedByteBuffer;
import java.nio.channels.FileChannel; /**
* Created by yangyu on 16/12/28.
*/ /**
* 比较Stream流,NIO ByteBuffer,NIO MappedByteBuffer性能对比
* 其中Stream最慢,NIO MappedByteBuffer最快
* Stream:1000ms
* NIO ByteBuffer:220ms
* NIO MappedByteBuffer:112ms
*/
public class Compare { /**
* 使用stream作为IO流读取和写入文件
* 速度:1000ms左右
*
* @throws IOException
*/
@Test
public void useStream() throws IOException { long startTime = System.currentTimeMillis();
/**
* 4000000个整数长度的文件
*/
int num = 2000 * 2000; /**
* 带缓冲的输出流,写文件
*/
DataOutputStream dataOutputStream = new DataOutputStream(new BufferedOutputStream(new FileOutputStream("/Users/yangyu/Downloads/compare.tmp")));
for (int i = 0; i < num; i++) {
dataOutputStream.writeInt(i);
}
dataOutputStream.close(); int data = 0;
/**
* 带缓冲的输入流,读文件
*/
DataInputStream in = new DataInputStream(new BufferedInputStream(new FileInputStream("/Users/yangyu/Downloads/compare.tmp")));
try {
while (true) {
data = in.readInt();
}
} catch (EOFException e) {
System.out.println("读取完成"+data);
}
in.close();
long endTime = System.currentTimeMillis();
System.out.println("ms:" + (endTime - startTime));
} /**
* 使用NIO ByteBuffer
* 时间:220ms
* @throws IOException
*/
@Test
public void useNioByteBuffer() throws IOException {
long startTime = System.currentTimeMillis();
int num = 2000*2000;
/**
* 文件输出流
*/
FileOutputStream fileOutputStream = new FileOutputStream("/Users/yangyu/Downloads/compare.tmp");
/**
* NIO Channel 通道
*/
FileChannel fileChannel = fileOutputStream.getChannel();
/**
* ByteBuffer缓冲区
*/
ByteBuffer buffer = ByteBuffer.allocate(num*5);
for (int i = 0; i < num; i++) {
buffer.putInt(i);
}
/**
* 为写做准备
*/
buffer.flip();
/**
* 写操作
*/
fileChannel.write(buffer);
fileChannel.close(); /**
* 缓冲区
*/
ByteBuffer buffer1 = ByteBuffer.allocate(num*5);
/**
* 文件输入流
*/
FileInputStream in = new FileInputStream("/Users/yangyu/Downloads/compare.tmp");
/**
* 输入通道
*/
FileChannel fin = in.getChannel();
/**
* 为读取做准备
*/
buffer1.clear();
System.out.println(buffer1.limit());
/**
* 读取
*/
fin.read(buffer1);
fin.close(); long endTime = System.currentTimeMillis();
System.out.println("ms:" + (endTime - startTime));
buffer1.flip();
System.out.println(buffer1.limit());
} /**
* 使用MappedByteBuffer,通过FileChannel将文件映射到内存
* 时间:112ms
* @throws IOException
*/
@Test
public void useRandomAccess() throws IOException {
long startTime = System.currentTimeMillis();
int num = 2000*2000; /**
* 使用可随机访问位置的RandomAccessFile
*/
RandomAccessFile file = new RandomAccessFile("/Users/yangyu/Downloads/compare.tmp","rw");
/**
* 获取通道Channel
*/
FileChannel fileChannel = file.getChannel();
/**
* 将文件映射到缓冲区MappedByteBuffer
*/
MappedByteBuffer mappedByteBuffer = fileChannel.map(FileChannel.MapMode.READ_WRITE,0,num*4);
/**
* 写文件
*/
for (int i = 0; i < num; i++) {
mappedByteBuffer.putInt(i);
}
fileChannel.close(); int data=0;
RandomAccessFile file1 = new RandomAccessFile("/Users/yangyu/Downloads/compare.tmp","rw");
FileChannel fc = file1.getChannel();
MappedByteBuffer mappedByteBuffer1 = fc.map(FileChannel.MapMode.READ_WRITE,0,file1.length());
/**
* 读文件
*/
while (mappedByteBuffer1.hasRemaining()){
data = mappedByteBuffer1.getInt();
}
fc.close();
long endTime = System.currentTimeMillis();
System.out.println("ms:" + (endTime - startTime));
System.out.println(data);
}
}

结论非常明显啦,以后再使用IO读写文件的时候,多使用NIO MappedByteBuffer吧,毕竟NIO比老IO性能好太多啦。

Java--Stream,NIO ByteBuffer,NIO MappedByteBuffer性能对比的更多相关文章

  1. NIO与普通IO文件读写性能对比

    最近在熟悉java的nio功能.nio采用了缓冲区的方式进行文件的读写,这一点更接近于OS执行I/O的方式.写了个新旧I/O复制文件的代码,练练手,顺便验证一下两者读写性能的对比,nio是否真的比普通 ...

  2. java.nio.ByteBuffer中的flip()、rewind()、compact()等方法的使用和区别

    java.nio.ByteBuffer 1. ByteBuffer中的参数position.limit.capacity.mark含义: position:表示当前指针的位置(下一个要操作的数据元素的 ...

  3. 5种调优Java NIO和NIO.2的方式

    Java NIO(New Input/Output)——新的输入/输出API包——是2002年引入到J2SE 1.4里的.Java NIO的目标是提高Java平台上的I/O密集型任务的性能.过了十年, ...

  4. Java的BIO,NIO,AIO

    Java中的IO操作可谓常见.在Java的IO体系中,常有些名词容易让人困惑不解.为此,先通俗地介绍下这些名词. 1 什么是同步? 2 什么是异步? 3 什么是阻塞? 4 什么是非阻塞? 5 什么是同 ...

  5. 顺序、随机IO和Java多种读写文件性能对比

    概述 对于磁盘的读写分为两种模式,顺序IO和随机IO. 随机IO存在一个寻址的过程,所以效率比较低.而顺序IO,相当于有一个物理索引,在读取的时候不需要寻找地址,效率很高. 基本流程 总体结构 我们编 ...

  6. Atitit.病毒木马的快速扩散机制原理nio 内存映射MappedByteBuffer

    Atitit.病毒木马的快速扩散机制原理nio 内存映射MappedByteBuffer 1. Java NIO(New Input/Output)1 1.1. 变更通知(因为每个事件都需要一个监听者 ...

  7. Java NIO、NIO.2学习笔记

    相关学习资料 http://www.molotang.com/articles/903.html http://www.ibm.com/developerworks/cn/education/java ...

  8. 【转载】Java NIO学习 & NIO BIO AIO 比较

    可以参考这个页面: http://www.iteye.com/magazines/132-Java-NIO (下面这个页面也有) http://ifeve.com/overview/ 另,在这篇文章里 ...

  9. java学习-NIO(五)NIO学习总结以及NIO新特性介绍

    我们知道是NIO是在2002年引入到J2SE 1.4里的,很多Java开发者比如我还是不知道怎么充分利用NIO,更少的人知道在Java SE 7里引入了更新的输入/输出 API(NIO.2).但是对于 ...

随机推荐

  1. CSS3 Animation制作飘动的浮云和星星效果

    带平行视差效果的星星 先看效果: 如果下方未出现效果也可前往这里查看 http://sandbox.runjs.cn/show/0lz3sl9y 下面我们利用CSS3的animation写出这样的动画 ...

  2. Go语言实战 - 创业进行时之创业伊始

    在工作了10年之后,我于32岁的年纪在两个月前辞职创业了. 简单介绍一下之前的整个职业生涯,挺典型的,工程师 –> 资深工程师 –> 架构师 –> 项目经理 –> 部门经理,可 ...

  3. 【原】Python 用例:二进制写入和读取文件内容

    import pickle as p shoplistfile='shoplist.data' shoplist=['apple','carrot'] # because the dump opera ...

  4. iOS----- Crash 分析(文二)-崩溃日志组成

    iOS Crash 分析(文二)-崩溃日志组成 现在我们看一个淘宝iOS主客崩溃的例子: ### 1.进程信息 ### Incident Identifier: E4201F10-6F5F-40F9- ...

  5. Android知识——ViewHolder的作用与用法

    ViewHolder通常出现在适配器里,为的是listview滚动的时候快速设置值,而不必每次都重新创建很多对象,从而提升性能.在android开发中Listview是一个很重要的组件,它以列表的形式 ...

  6. MFC的定时器OnTimer

    本文总结来源出自鸡啄米,感谢鸡啄米.来源:http://www.jizhuomi.com/software/232.html 定时器简介 定时器,可以帮助开发者或者用户定时完成某项任务.在使用定时器时 ...

  7. 深入学习jQuery选择器系列第七篇——表单选择器

    × 目录 [1]表单元素 [2]对象属性 前面的话 无论是提交还是传递数据,表单元素在动态交互页面的作用是非常重要的.jQuery专门加入了表单选择器,从而能够极其方便地获取到某个类型的表单元素 表单 ...

  8. BFC之清除浮动篇&clear

    我们在日常代码生活中,或多或少会利用浮动来布局,例如导航布局,如下图所示: 但是,我们在实现的时候,经常会遇到父元素“塌陷”以及清除浮动问题.例如 <!DOCTYPE html> < ...

  9. web前端基础知识总结

    上个寒假总结的web前端的一些知识点给大家分享一下 1.<html>和</html> 标签限定了文档的开始和结束点. 属性: (1)  dir: 文本的显示方向,默认是从左向右 ...

  10. Expression Template(表达式模板,ET)

    1.前言 在前一篇文章自己实现简单的string类中提到在实现+操作符重载函数时,为了防止返回时生成的临时对象调用拷贝构造函数动态申请内存空间,使用了一个叫move的函数,它是C++0x新增的特性.既 ...