本次对比内容为:(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. Ubuntu 远程 Jupyter 配置

    Ubuntu 远程 Jupyter 配置 每次上课都要重新部署环境,最近看到阿里云的大学生优惠活动,就着手了一台云服务器,于是就把环境部署在上面了. 环境:阿里云 Ubuntu 16.04 64位 新 ...

  2. python程序—利用socket监控端口

    利用socket监控服务器端口,端口不通时,发邮件提醒 import yagmail #导入yagmail模块 import re #导入re模块,进行正则匹配 import socket #导入so ...

  3. 支付宝支付之App支付

    与微信支付对比,支付宝支付就没有那么多坑了,毕竟支付宝开放平台的文档还是描述的很详细的. 支付宝开放平台地址:https://docs.open.alipay.com/204/105297/ 支付宝支 ...

  4. ELK6.6.0+filebeat6.6.0部署

    elastic不能用root用户去启动,否则会报错,所以创建elastic用户ES集群部署 1.创建elastic用户 $ useradd elastic $ passwd elastic 2..部署 ...

  5. 忽略 iconv 转码错误导致输出中断

    在遇到一些特殊字符时候,使用iconv转码会提示报错,导致整段文字输出为空,解决的方法是增加TRANSLIT//IGNORE $str = iconv("UTF-8", " ...

  6. Unity3d外包公司|UE4外包公司:谷歌首款Daydream VR设备上手

    这款售价仅为79美元(约合人民币525元)的产品内含“够用”的手柄和一台头戴设备,只要你有一台支持月日,10月5日,dream平台的手机(未来将成为安卓平台的标配),就能体验VR的乐趣. 即使该产品最 ...

  7. unity项目build成webgl时选择生成目录(解决方法)

    在unity里点击File>>Build Settings...>>勾选你要生成的Scenes>>选择webgl>>后面Development Buil ...

  8. Docker生态会重蹈Hadoop的覆辙吗?

    Docker生态会重蹈Hadoop的覆辙吗? http://mp.weixin.qq.com/s?__biz=MzA5NDg3ODMxNw==&mid=2649535024&idx=1 ...

  9. 关于p-Laplace的想法

    最近的想法 关于p-Laplace的想法 对于一类p-laplace方程的问题的想法. 现在摆在面前的是首先我要考虑的问题是$W^{1,p}$估计对于凸区域上的p-laplace是否成立,或者更广.. ...

  10. Dividing the numbers CodeForces - 899C (构造)

    大意: 求将[1,n]划分成两个集合, 且两集合的和的差尽量小. 和/2为偶数最小差一定为0, 和/2为奇数一定为1. 显然可以通过某个前缀和删去一个数得到. #include <iostrea ...