java read性能_java IO性能对比----read文件

本次对比内容为:(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 字节)

packagejavaIO;import java.io.*;importjava.nio.ByteBuffer;importjava.nio.channels.FileChannel;/*** Created by EnjoyD on 2016/12/20.*/

public classIO {private static String filepath="." + File.separator +"testIO.txt";private abstract static classTester{privateString name;

Tester(String name){this.name=name;

}private voidrunTest(){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() throwsIOException;

}private static Tester [] testers={new Tester("fileInputStream") {

@Overridepublic void test() throwsIOException {

FileInputStream f=newFileInputStream(filepath);

{intread;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") {

@Overridepublic void test() throwsIOException {

DataInputStream d=new DataInputStream(newFileInputStream(filepath));

{intread;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") {

@Overridepublic void test() throwsIOException{

BufferedInputStream b=new BufferedInputStream(new FileInputStream(filepath),1024);

{intread;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)") {

@Overridepublic void test() throwsIOException {

DataInputStream d=new DataInputStream(new BufferedInputStream(new FileInputStream(filepath),1024));

{intread;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") {

@Overridepublic void test() throwsIOException {

Reader f=new BufferedReader(newFileReader(filepath));

{intread;while((read=f.read())!=-1);

}

f.close();

}

},new Tester("channel") {

@Overridepublic void test() throwsIOException {

FileChannel fc=newFileInputStream(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") {

@Overridepublic void test() throwsIOException {

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 voidmain(String[] args) {for(Tester t :testers){

t.runTest();

}

}

}

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

78b308be8e5830feba55f52b19267867.png

3d7d9d7d99adf34287f3054312885754.png

b05b2249fc07c05f1a2d22458506bd75.png

c5f448aa37790bfc74af27fa776417a8.png

b9a6634e9c6d1568345d710d976f0b36.png

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

e3a5344d80d60e2a82aa91bb0fac5fef.png

944cfbfa6e8037bbf188b67875ab2280.png

c9f54c4099fba3c5ec9400a894ed8ddb.png

cd4d6df9c0b835aafd009c698f7303ab.png

127f5a68832a41234b6cf209796d642b.png

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

55b71e813c042ef7beb983b06cee7a8b.png

916ccd9005a3614d9f80d123c056c8d9.png

5a5cd1b9092408d93070f9aae43227f2.png

5b72a93b5f4e95dd6702830bf91abcfc.png

653d9fe6ffa245b499b535bce091750c.png

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

ea79e25baa89f426e124ffb0038a21b2.png

2aa9988a344f6a4d724ce8b7fa3ec780.png

c541fa55a11ecae9e6344ae4f6c613b5.png

96c96faa2d5ab008bd3f249f9540d6e6.png

872f4e17650e821761b1d606f9e53b53.png

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

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值