本次对比内容为:(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. bzoj2131 免费的馅饼——树状数组优化dp

    中文题目,问你最后能最多够得到多少价值的馅饼.因为宽度10^8且个数为10^5.所以不可以用dp[x][y]表示某时间某地点的最大权值. 假设你在x点处接到饼后想去y点接饼.那么需要满足的条件是t[y ...

  2. python - Random常用方法记录

    import random # range [a,b) 不包含b # 获取随机整数 # randrange [a,b) 不包含b a = random.randrange(0, 101, 5) # E ...

  3. ng/cli uses yarn as the package manager

    Switch to working directory Excuting the following command ng config cli.packageManager yarn

  4. Docker介绍及使用

    什么是容器? 容器就是在隔离的环境运行的一个进程,如果进程停止,容器就会销毁.隔离的环境拥有自己的系统文件,ip地址,主机名等,kvm虚拟机,linux,系统文件 程序:代码,命令 进程:正在运行的程 ...

  5. CentOS7.X中使用yum安装nginx的方法

    nginx官方文档说明:http://nginx.org/en/linux_packages.html#RHEL-CentOS 一.安装前准备: yum install yum-utils 二.添加源 ...

  6. Windows 下 docker 部署 gitlab ci

    一.安装 1. 安装 docker Docker下载 注意:Windows 10 家庭版获取 之前的版本不能直接安装 Docker ,而是需要去安装 Docker Toolbox 我这里安装的是 Do ...

  7. erlang下lists模块sort(排序)方法源码解析(二)

    上接erlang下lists模块sort(排序)方法源码解析(一),到目前为止,list列表已经被分割成N个列表,而且每个列表的元素是有序的(从大到小) 下面我们重点来看看mergel和rmergel ...

  8. 构建可扩展的微博架构(qcon beijing 2010演讲)#高并发经验值#

    构建可扩展的微博架构(qcon beijing 2010演讲) http://timyang.net/architecture/microblog-design-qcon-beijing/ 互联网架构 ...

  9. web api 安全

    这方面的文章已经有很多了,我只是记录一下自己在项目中应用的具体实现 客户端 DateTime t = DateTime.Now; long timeStamp = SignHelper.Convert ...

  10. shift and算法

    1. CF 914F Substrings in a String 大意: 给定一个串s, q个询问, (1)单点修改, (2)询问[l,r]范围内串y的出现次数. shift and算法板子题 #p ...