本次对比内容为:(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. 使用RStudio调试(debug)基础学习(二)和fGarch包中的garchFit函数估计GARCH模型的原理和源码

    一.garchFit函数的参数--------------------------------------------- algorithm a string parameter that deter ...

  2. JDBC中execute、executeQuery和executeUpdate的区别

    Statement 接口提供了三种执行 SQL 语句的方法:executeQuery.executeUpdate 和 execute.使用哪一个方法由 SQL 语句所产生的内容决定. 1>方法e ...

  3. 显示等待 (web自动化测试)

    from selenium.webdriver.common.keys import Keys from selenium.webdriver.common.by import By from sel ...

  4. 在action中进行文件下载,下载时运行不报错,可是也不下载

    在写前端下载页面时,使用ajax方式调用action中的方法,然后就将下载内容返回js中了,所以没有下载,之后改为使用Windows.location进行下载,就没有问题了. action中代码: i ...

  5. (8)socketserver并发

    (1)client客户端: import socket sk = socket.socket() sk.connect( ("127.0.0.1",9000)) while Tru ...

  6. [Database] 不知道表名和字段查找值=1234的数据.

      --如果表比较大,时间会比较长 DECLARE @searchValue NVARCHAR(50) SET @searchValue='1234' DECLARE @t TABLE ( rowNu ...

  7. 【转】RTP学习笔记

    转自:https://www.cnblogs.com/yoyotl/p/5650101.html 一.定义 实时传输协议(Real- time Transport Protocol,RTP)是在Int ...

  8. 2018-2019-2 20165303《网络对抗技术》Exp2 后门原理与实践

    实验内容 (1)使用netcat获取主机操作Shell,cron启动 (0.5分) (2)使用socat获取主机操作Shell, 任务计划启动 (0.5分) (3)使用MSF meterpreter( ...

  9. 动态嵌套form,使用Stimulus Js库(前后端不分离)

    我的git代码:https://github.com/chentianwei411/nested_form-Stimulus- Stimulus:     https://www.cnblogs.co ...

  10. android --- api json数据

    「一个」.「Time 时光」.「开眼」.「一席」.「梨视频」.「微软必应词典」.「金山词典」.「豆瓣电影」.「中央天气」.「魅族天气」.「每日一文」.「12306」.「途牛」.「快递100」.「快递」 ...