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 字节)
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文件的更多相关文章
- Tomcat9.0.13 Bug引发的java.io.IOException:(打开的文件过多 Too many open files)导致服务假死
问题背景: 笔者所在的项目组最近把生产环境Tomcat迁移到Linux,算是顺利运行了一段时间,最近一个低概率密度的(too many open files)问题导致服务假死并停止响应客户端客户端请求 ...
- 解决: java.io.IOException: 打开的文件过多 的问题
问题 前一阵子公司项目做了一次压力测试, 中间出现了一个问题: 在50多个并发的时候会出现 java.io.IOException: 打开的文件过多 这个异常. 但是在没有并发的时候是不会出现这个问题 ...
- java io性能分析
摘要: 本文大多技术围绕调整磁盘文件 I/O,但是有些内容也同样适合网络 I/O 和窗口输出. 第一部分技术讨论底层的I/O问题,然后讨论诸如压缩,格式化和串行化等高级I/O问题.然而这个讨论没有包含 ...
- java Io流输出指定文件的内容
package com.hp.io; import java.io.*; public class BufferedReaderTest{ /** *@param 想想 */ public st ...
- JAVA IO流编程 实现文件的写入、写出以及拷贝
一.流的概念 流:数据在数据源(文件)和程序(内存)之间经历的路径. 输入流:数据从数据源(文件)到程序(内存)的路径. 输出流:数据从程序(内存)到数据源(文件)的路径. 以内存为参照,如果数据向内 ...
- java IO流实现删除文件夹以及文件夹中的内容
这篇主要是对IO文件流对文件常用处理中的删除文件夹,平时我们直接删除文件夹既可以删除里面的全部内容. 但是java在实现删除时,只能是文件才会被删除. 所以这里需要定义一个方法,来递归调用方法(递归调 ...
- Java IO 之 RandomAccessFile 操作文件内容
RandomAccessFile类实现对文件内容的随机读写 文件内容的随机操作,重难点在于字符操作,具体查看API package org.zln.io.file; import java.io.IO ...
- Java IO流中 File文件对象与Properties类(四)
File类 用来将文件或目录封装成对象 方便对文件或目录信息进行处理 File对象可以作为参数传递给流进行操作 File类常用方法 创建 booleancreateNewFile():创建新文件,如果 ...
- Java基础(二十五)Java IO(2)文件File类
File类是一个与流无关的类.File类的对象可以获取文件及其文件所在的目录.文件的长度等信息. 1.File对象的常用构造方法. (1)File(String pathname) File file ...
随机推荐
- Best Practices for Assembly Loading
原文链接 This article discusses ways to avoid problems of type identity that can lead to InvalidCastExce ...
- 阿里云盾SSL证书即将到期怎么办?
如果你也像我一样用了一个有效期限1年的DV证书,颁发厂商:Symantec.那当这个证书快到期的时候要怎么更换证书呢?1.证书安装环境是IIS82.下载重新购买的免费证书,对新证书进行重新先发.3.证 ...
- iOS QQ 扫一扫 捷径URL
*:first-child { margin-top: 0 !important; } body > *:last-child { margin-bottom: 0 !important; } ...
- yii restful和一般路由共存
<?php namespace app\controllers; use Yii; use yii\rest\ActiveController; /** * */ class TestContr ...
- 浅谈现公司的Spring Cloud微服务框架
目录 说在前面 服务注册与发现 服务网关及熔断 配置中心 消息中心.服务链路追踪 小言 说在前面 本文偏小白,大佬慎入,若有错误或者质疑,欢迎留言提问,谢谢,祝大家新年快乐. spring cloud ...
- linux批量配置ip
获取使用的网卡接口 ip a 2.查看系统版本 cat /etc/redhat-release 3.执行配置脚本 wget http://d.sshby.com/biaozhun.tar&& ...
- 异常:Error resolving template "xxx", template might not exist or might not be accessible...解决办法
在开发环境下正常,但使用jar运行时,报错Error resolving template template might not exist or might not be accessible,意思 ...
- vue版 弹幕
效果: 下载 优化版下载: https://pan.baidu.com/s/1mvKGwJsBjXd2hvvi5Rp9pA 用法: import barrage from '../components ...
- OO第二单元多线程电梯总结分析
一.概述 这一部分的作业考察的关注点与上一次的作业有所不同,上一次的考察重点主要集中在输入输出的判定以及多态的考察上面,而这一次是让我们进行多线程程序的调度与开发.这次开发过程中最大的感受就是自己之前 ...
- C#操作SQLServer2012类
public class SqlServerService { public string CONN_STRING { get; set; } = "Data Source=.;Databa ...