本次对比内容为:(jdk1.8)

fileInputStream:最基本的文件读取(带自己声明的缓冲区)

dataInputStream:字节读取,在《java编程思想》一书中描述为使用最多的读取文件方式(带自己声明的缓冲区)

bufferedInputStream:带缓冲的读取方式(带自己声明的缓冲区)

dataInputStream(bufferedInputStream):组合后的读取方式(带自己声明的缓冲区)

bufferedReader:字符读取方式

channel:nio中的新的读取方式

map:内存映射文件

(说明:本次对比都有缓存参与,不对比无缓存的情况,因为无缓存情况下的任意方式的读性能远远落后于有缓存的方式,因此不在此对比)

对同一文件的读取:文件为大小为:a)847 MB (888,888,890 字节) b)75.2 MB (78,888,890 字节) c) 6.56 MB (6,888,890 字节) d) 575 KB (588,890 字节)

package javaIO;

import java.io.*;
import java.nio.ByteBuffer;
import java.nio.channels.FileChannel; /**
* Created by EnjoyD on 2016/12/20.
*/
public class IO {
private static String filepath="." + File.separator +"testIO.txt";
private abstract static class Tester{
private String name;
Tester(String name){
this.name=name;
}
private void runTest(){
try {
long start=System.currentTimeMillis();
test();
long offset=System.currentTimeMillis()-start;
System.out.println(this.name+":"+offset);
}catch (Exception e){
System.err.println("err");
e.printStackTrace();
}
}
public abstract void test() throws IOException;
}
private static Tester [] testers={
new Tester("fileInputStream") {
@Override
public void test() throws IOException {
FileInputStream f=new FileInputStream(filepath);
{
int read;
byte []b=new byte[1024];
while((read=f.read(b,0,1024))!=-1)
for (int i=0;i<1024;i++) {
byte tem = b[i];
}
}
f.close();
}
},
new Tester("dataInputStream") {
@Override
public void test() throws IOException {
DataInputStream d=new DataInputStream(new FileInputStream(filepath));
{
int read;
byte []b=new byte[1024];
while ((read=d.read(b,0,1024))!=-1)
for (int i=0;i<1024;i++) {
byte tem = b[i];
}
}
d.close();
}
},
new Tester("bufferedInputStream") {
@Override
public void test() throws IOException{
BufferedInputStream b=new BufferedInputStream(new FileInputStream(filepath),1024);
{
int read;
byte [] by=new byte[1024];
while((read=b.read(by,0,1024))!=-1)
for (int i=0;i<1024;i++) {
byte tem = by[i];
}
}
b.close();
}
},
new Tester("datainputStream(buferedinputStream)") {
@Override
public void test() throws IOException {
DataInputStream d=new DataInputStream(new BufferedInputStream(new FileInputStream(filepath),1024));
{
int read;
byte [] by=new byte[1024];
while((read=d.read(by,0,1024))!=-1)
for (int i=0;i<1024;i++) {
byte tem = by[i];
} }
d.close();
}
},
new Tester("bufferedReader") {
@Override
public void test() throws IOException {
Reader f=new BufferedReader(new FileReader(filepath));
{
int read;
while((read=f.read())!=-1);
}
f.close();
}
},
new Tester("channel") {
@Override
public void test() throws IOException {
FileChannel fc=new FileInputStream(filepath).getChannel();
ByteBuffer buff=ByteBuffer.allocate(1024);
while((fc.read(buff)!=-1)){
              buff.flip();
while (buff.hasRemaining()){
buff.get();
}
buff.clear();
}
fc.close();
}
},
new Tester("maped") {
@Override
public void test() throws IOException {
FileChannel fc=new RandomAccessFile(filepath,"rw").getChannel();
ByteBuffer buff=fc.map(FileChannel.MapMode.READ_ONLY,0,fc.size()).asReadOnlyBuffer();
while (buff.hasRemaining()) {
buff.get();
}
fc.close();
}
}
}; public static void main(String[] args) {
for (Tester t :testers){
t.runTest();
}
}
}

测试1:847 MB (888,888,890 字节)  单位“豪秒”

测试2:75.2 MB (78,888,890 字节) 单位“豪秒”

测试3:6.56 MB (6,888,890 字节) 单位“豪秒”

测试4:575 KB (588,890 字节) 单位“豪秒”

根据这些基本的测试来看,对于大文件读取,在使用了自己声明的1K缓冲区后,前四种方式的读取字节的速度相差不多,并且与最后一种方式----内存映射文件的读取速度相差不多。因此如果需要按字节进行读取,前四种方式皆可,当然如果内存足够大,可以直接使用内存映射文件的方式读取。

java IO性能对比----read文件的更多相关文章

  1. Tomcat9.0.13 Bug引发的java.io.IOException:(打开的文件过多 Too many open files)导致服务假死

    问题背景: 笔者所在的项目组最近把生产环境Tomcat迁移到Linux,算是顺利运行了一段时间,最近一个低概率密度的(too many open files)问题导致服务假死并停止响应客户端客户端请求 ...

  2. 解决: java.io.IOException: 打开的文件过多 的问题

    问题 前一阵子公司项目做了一次压力测试, 中间出现了一个问题: 在50多个并发的时候会出现 java.io.IOException: 打开的文件过多 这个异常. 但是在没有并发的时候是不会出现这个问题 ...

  3. java io性能分析

    摘要: 本文大多技术围绕调整磁盘文件 I/O,但是有些内容也同样适合网络 I/O 和窗口输出. 第一部分技术讨论底层的I/O问题,然后讨论诸如压缩,格式化和串行化等高级I/O问题.然而这个讨论没有包含 ...

  4. java Io流输出指定文件的内容

    package com.hp.io; import java.io.*; public class  BufferedReaderTest{ /** *@param   想想 */ public st ...

  5. JAVA IO流编程 实现文件的写入、写出以及拷贝

    一.流的概念 流:数据在数据源(文件)和程序(内存)之间经历的路径. 输入流:数据从数据源(文件)到程序(内存)的路径. 输出流:数据从程序(内存)到数据源(文件)的路径. 以内存为参照,如果数据向内 ...

  6. java IO流实现删除文件夹以及文件夹中的内容

    这篇主要是对IO文件流对文件常用处理中的删除文件夹,平时我们直接删除文件夹既可以删除里面的全部内容. 但是java在实现删除时,只能是文件才会被删除. 所以这里需要定义一个方法,来递归调用方法(递归调 ...

  7. Java IO 之 RandomAccessFile 操作文件内容

    RandomAccessFile类实现对文件内容的随机读写 文件内容的随机操作,重难点在于字符操作,具体查看API package org.zln.io.file; import java.io.IO ...

  8. Java IO流中 File文件对象与Properties类(四)

    File类 用来将文件或目录封装成对象 方便对文件或目录信息进行处理 File对象可以作为参数传递给流进行操作 File类常用方法 创建 booleancreateNewFile():创建新文件,如果 ...

  9. Java基础(二十五)Java IO(2)文件File类

    File类是一个与流无关的类.File类的对象可以获取文件及其文件所在的目录.文件的长度等信息. 1.File对象的常用构造方法. (1)File(String pathname) File file ...

随机推荐

  1. linux下自动获取并安装软件包 apt-get 的命令介绍

    apt-cache search package    搜索包 apt-cache show package    获取包的相关信息,如说明.大小.版本等 sudo apt-get install p ...

  2. RN截图并且下载问题

    神奇的BUG一大堆. 需求-->截图并且下载图片 实现: import ViewShot from "react-native-view-shot"; CameraRoll ...

  3. LEETCODE 07 09

    最近忙着面试耽误了几天,今天刷了07,09都是字符串处理,一个是大数反转,一个是回文数判断,我都是转成字符串处理的,过了是过了,但是挺慢的,先记着,等有机会优化下 题目 给定一个 32 位有符号整数, ...

  4. 代码生成器——实现生成pojo,sql,mapper接口

    代码生成器(记录一次兴趣代码,多多指教.转载请标明作者) 在我们开始实现代码生成器之前我们先来对代码生成器有一个简单的了解. 1.什么是代码生成器? 故名思义,也就是生成代码的一个程序.那它是一个什么 ...

  5. webpack-工程化工具

    一.简介 1.webpack 是 facebook 公司发布的一款工程化工具,早期有 react 使用. 2.核心理念: 一切都是资源,是资源我们就能模块化打包加载. 3.webpack 默认支持 c ...

  6. IT - 偶像的力量

    [丹尼斯·里奇]C语言,unix之父 [本贾尼·斯特劳斯特卢普]C++之父 [詹姆斯·高斯林 (James Gosling)]Java之父 [林纳斯·托瓦兹(Linus Torvalds)]Linux ...

  7. 内网环境使用ansible安装software 需要外网时,如何绑定代理呢

    内网环境使用ansible安装software 需要外网时,如何绑定代理呢? 方法一: 在ansible 的脚本里,yum install 的地方,添加语句: environment: https_p ...

  8. DAY18 常用模块(二)

    一.随机数:RANDOM 1.(0,1)小数:random.random() 2.[1,10]整数:random.randint(1,10) 3.[1,10)整数:random.randrang(1, ...

  9. 第 9 章 数据管理 - 073 - 如何实现跨 Docker 主机存储?

    从业务数据的角度看,容器可以分为两类: 无状态(stateless)容器 无状态是指容器在运行过程中不需要保存数据,每次访问的结果不依赖上一次访问,比如提供静态页面的 web 服务器. 有状态(sta ...

  10. CPU利用率和CPU负荷(CPU usage vs CPU load)

    对于CPU的性能监测,通常用top指令能显示出两个指标:cpu 利用率和cpu负荷. 其中%Cpu相关的内容: us表示用户进程cpu利用率,sy表示系统内核进程cpu利用率,ni表示运行正常进程消耗 ...