Java--Stream,NIO ByteBuffer,NIO MappedByteBuffer性能对比
目前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性能对比的更多相关文章
- NIO与普通IO文件读写性能对比
最近在熟悉java的nio功能.nio采用了缓冲区的方式进行文件的读写,这一点更接近于OS执行I/O的方式.写了个新旧I/O复制文件的代码,练练手,顺便验证一下两者读写性能的对比,nio是否真的比普通 ...
- java.nio.ByteBuffer中的flip()、rewind()、compact()等方法的使用和区别
java.nio.ByteBuffer 1. ByteBuffer中的参数position.limit.capacity.mark含义: position:表示当前指针的位置(下一个要操作的数据元素的 ...
- 5种调优Java NIO和NIO.2的方式
Java NIO(New Input/Output)——新的输入/输出API包——是2002年引入到J2SE 1.4里的.Java NIO的目标是提高Java平台上的I/O密集型任务的性能.过了十年, ...
- Java的BIO,NIO,AIO
Java中的IO操作可谓常见.在Java的IO体系中,常有些名词容易让人困惑不解.为此,先通俗地介绍下这些名词. 1 什么是同步? 2 什么是异步? 3 什么是阻塞? 4 什么是非阻塞? 5 什么是同 ...
- 顺序、随机IO和Java多种读写文件性能对比
概述 对于磁盘的读写分为两种模式,顺序IO和随机IO. 随机IO存在一个寻址的过程,所以效率比较低.而顺序IO,相当于有一个物理索引,在读取的时候不需要寻找地址,效率很高. 基本流程 总体结构 我们编 ...
- Atitit.病毒木马的快速扩散机制原理nio 内存映射MappedByteBuffer
Atitit.病毒木马的快速扩散机制原理nio 内存映射MappedByteBuffer 1. Java NIO(New Input/Output)1 1.1. 变更通知(因为每个事件都需要一个监听者 ...
- Java NIO、NIO.2学习笔记
相关学习资料 http://www.molotang.com/articles/903.html http://www.ibm.com/developerworks/cn/education/java ...
- 【转载】Java NIO学习 & NIO BIO AIO 比较
可以参考这个页面: http://www.iteye.com/magazines/132-Java-NIO (下面这个页面也有) http://ifeve.com/overview/ 另,在这篇文章里 ...
- java学习-NIO(五)NIO学习总结以及NIO新特性介绍
我们知道是NIO是在2002年引入到J2SE 1.4里的,很多Java开发者比如我还是不知道怎么充分利用NIO,更少的人知道在Java SE 7里引入了更新的输入/输出 API(NIO.2).但是对于 ...
随机推荐
- 《Entity Framework 6 Recipes》中文翻译系列 (45) ------ 第八章 POCO之获取原始对象与手工同步对象图和变化跟踪器
翻译的初衷以及为什么选择<Entity Framework 6 Recipes>来学习,请看本系列开篇 8-6 获取原始对象 问题 你正在使用POCO,想从数据库获取原始对象. 解决方案 ...
- Service基础使用
Service基础使用 之前的文章一直介绍Activity的使用,很多知识和用法单一的配合Activity使用,这次将总结Android四大组件之二--Service. 本文将要介绍以下内容: Ser ...
- The replication agent has not logged a progress message in 10 minutes.
打开Replication Monitor,在Subscription Watch List Tab中,发现有大量的status= “Performance critical” 的黄色Warning, ...
- LINQ系列:Linq to Object分组操作符
分组是指根据一个特定的值将序列中的值或元素进行分组.LINQ只包含一个分组操作符:GroupBy. GroupBy 1>. 原型定义 public static IQueryable<IG ...
- 【Win10 开发】读取PDF文档
关于用来读取PDF文档的内容的API,其实在Win8.1的时候就有,不过没关系,既咱们讨论的是10的UAP,连同8.1的内容也包括进去,所以老周无数次强调:把以前的内容学好了,就可以在不学习任何新知识 ...
- jquery 拖拽,框选的一点积累
拖拽draggable,框选 selectable,按ctrl多选,临近辅助对齐,从工具栏拖工具 等,和jqueryui的selectable不同,是在一个父div里框选子div(类似框选文件),一 ...
- JavaScript 中的类方法,对象方法,Prototype方法
<script type="text/javascript"> function baseClass() { this.showMsg = function() { a ...
- lintcode循环数组之连续子数组求和
v 题目:连续子数组求和 II 给定一个整数循环数组(头尾相接),请找出一个连续的子数组,使得该子数组的和最大.输出答案时,请分别返回第一个数字和最后一个数字的值.如果多个答案,请返回其中任意一个. ...
- DOM操作
DOM操作,JS来操作页面 wiindows对象操作 document对象操作 点击事件:将DIV要执行的事件代码装封 onclick 鼠标单击 ondblelick 鼠标双击 onk ...
- EntityFramework之你不知道的那些事(七)
前言 前面一系列几乎都是循序渐进式的进行叙述,似乎脚步走得太快了,于是我开始歇一歇去追寻一些我所不太了解的细枝末节,在此过程中也屡次碰壁,但是唯有如此才能更好的成长,不是吗!希望此文对你亦有帮助. 属 ...