我们知道内存映射文件读取是各种读取方式中速度最快的,但是内存映射文件读取的API里没有提供按行读取的方法,需要自己实现。下面就是我利用内存映射文件实现按行读取文件的方法,如有错误之处请指出,或者有更好更快的实现方式麻烦也提供一下代码。

代码如下:

public class testMemoryMappedFile {

	public static void main(String[] agrs) throws IOException{
RandomAccessFile memoryMappedFile = new RandomAccessFile("D://test.txt","r");
int size =(int)memoryMappedFile.length();
MappedByteBuffer out = memoryMappedFile.getChannel().map(FileChannel.MapMode.READ_ONLY,0,size);
long start = System.currentTimeMillis();
//要根据文件行的平均字节大小来赋值
final int extra = 200;
int count = extra;
byte[] buf = new byte[count];
int j=0;
char ch ='\0';
boolean flag = false;
while(out.remaining()>0){
byte by = out.get();
ch =(char)by;
switch(ch){
case '\n':
flag = true;
break;
case '\r':
flag = true;
break;
default:
buf[j] = by;
break;
}
j++;
//读取的字符超过了buf 数组的大小,需要动态扩容
if(flag ==false && j>=count){
count = count + extra;
buf = copyOf(buf,count);
}
if(flag==true){
//这里的编码要看文件实际的编码
String line = new String(buf,"utf-8");
System.out.println(line);
flag = false;
buf = null;
count = extra;
buf = new byte[count];
j =0;
} }
//处理最后一次读取
if(j>0){
String line = new String(buf,"utf-8");
System.out.println(line);
} long end = System.currentTimeMillis();
System.out.println("耗时:"+(end-start));
memoryMappedFile.close(); } //扩充数组的容量
public static byte[] copyOf(byte[] original,int newLength){
byte[] copy = new byte[newLength];
System.arraycopy(original,0,copy,0,Math.min(original.length,newLength));
return copy;
} }

经过测试,可以达到50M/s的速度,依然比RandomAccessFile按行读取快100倍以上。

注意点:byte[] buf 这个字节数组的大小要动态扩容,如果一直固定的话速度也会比较慢,特别是如果设置很大的话,会更加慢。

参考博客:https://www.ibm.com/developerworks/cn/java/l-javaio/index.html 这个博客值得一看,对各个读取方式的速度做了一个比较,同时自己实现了优化的方法

Java利用内存映射文件实现按行读取文件的更多相关文章

  1. C++ 按行读取文件并打印

    #include<iostream> #include<fstream> #include<string> #include <vector> #inc ...

  2. Java NIO内存映射---上G大文件处理(转)

    林炳文Evankaka原创作品.转载请注明出处http://blog.csdn.net/evankaka 摘要:本文主要讲了java中内存映射的原理及过程,与传统IO进行了对比,最后,用实例说明了结果 ...

  3. Java NIO 内存映射文件

    Java NIO 内存映射文件 @author ixenos 文件操作的四大方法 前提:内存的访问速度比磁盘高几个数量级,但是基本的IO操作是直接调用native方法获得驱动和磁盘交互的,IO速度限制 ...

  4. C++/Php/Python/Shell 程序按行读取文件或者控制台

    写程序经常需要用到从文件或者标准输入中按行读取信息,这里汇总一下.方便使用 1. C++ 读取文件 #include<stdio.h> #include<string.h> i ...

  5. Python跳过第一行读取文件内容

    Python编程时,经常需要跳过第一行读取文件内容.比较容易想到是为每行设置一个line_num,然后判断line_num是否为1,如果不等于1,则进行读取操作.相应的Python代码如下: inpu ...

  6. python_基础学习_01_按行读取文件的最优方法

    python 按行读取文件 ,网上搜集有N种方法,效率有区别,先mark最优答案,下次补充测试数据 with open('filename') as file: for line in file: d ...

  7. python 按每行读取文件怎么去掉换行符

    python按每行读取文件后,会在每行末尾带上换行符,这样非常不方便后续业务处理逻辑,需要去掉每行的换行符,怎么去掉呢?看下面的案例: >>> a = "hello wor ...

  8. Shell按行读取文件的3种方法

    Shell按行读取文件的方法有很多,常见的三种方法如下: 要读取的文件: [root@mini05 -]# cat file.info 写法一: [root@mini05 -]# cat read1. ...

  9. Python按行读取文件、写文件

    Python按行读取文件 学习了:https://www.cnblogs.com/scse11061160/p/5605190.html file = open("sample.txt&qu ...

随机推荐

  1. 性能测试常用sql技巧_Oracle

    做了一段时间的性能测试,把自己在性能测试过程中,使用到的Oracle中用到的sql语句整理一番,做个备忘: (1)多个字段以某种格式拼接 "||"字符串拼接符; 示例:将" ...

  2. epoll的ET和LT模式比较 - 源码分析

    eventpoll是一种文件,它实现了一种机制利用一条rdllist队列来避免阻塞地进行poll.eventpoll归根到底还是在使用poll.而ET比LT高效,并不在于是否使用了poll,更不能说是 ...

  3. 1、AngularJS 验证

    1.formName.inputFieldName.property($pristine(未修改).$dirty(修改过的).$valid(合法).$invalid(非法).$error(当前表单所有 ...

  4. MySQL如何有效的存储IP地址及字符串IP和数值之间如何转换

    mysql> select inet_aton('192.168.0.1'); +--------------------------+ | inet_aton('192.168.0.1') | ...

  5. php中的冒泡排序算法

    <?php //php中的冒泡排序算法 //从大到小的排序方式 ,$arr[$j]>$arr[$j+1](这里换成了从小到大的排序方式) $arr=array(); $arr=array( ...

  6. 5.如何修改maven本地仓库

    首先测试机子上时候安装上maven,步骤是win+r-->cmd-->mvn -v-->看其是否出现如下字样:   如果时间长了你忘记了你安装的maven目录或者jdk目录,那么下面 ...

  7. H5学习第三周

    今天主要总结弹性布局 flex使用 1.给父容器添加display flex/inline-flex;属性 2.父容器可以使用的属性值有 >>>flex-direction 属性决定 ...

  8. SharePoint 2016 修改左上角连接

    SharePoint 2016默认会有左上角这样的一个功能.  估计都想把它改掉. 方法1: 打开,输入下面的命令,可将图中的sharepoint修改为想要的文字 $webapp = Get-SPWe ...

  9. 图论基础之Dijkstra算法的初探

         图论,顾名思义就是有图有论.        图:由点"Vertex"和边"Edge "组成,且图分为有向图和无向图(本文讨论有向图),之前做毕业设计的 ...

  10. 数控G代码编程详解大全

    一.G代码功能简述 G00------快速定位 G01------直线插补 G02------顺时针方向圆弧插补 G03------逆时针方向圆弧插补 G04------定时暂停 G05------通 ...