我们知道内存映射文件读取是各种读取方式中速度最快的,但是内存映射文件读取的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. java加密算法入门(三)-非对称加密详解

    1.简单介绍 这几天一直在看非对称的加密,相比之前的两篇内容,这次看了两倍多的时间还云里雾里的,所以这篇文章相对之前的两篇,概念性的东西多了些,另外是代码的每一步我都做了介绍,方便自己以后翻阅,也方便 ...

  2. RSA加密通信小结(三)--生成加解密所需的SSL命令与流程

    在iOS中使用RSA加密解密,需要用到.der和.p12后缀格式的文件,其中.der格式的文件存放的是公钥(Public key)用于加密,.p12格式的文件存放的是私钥(Private key)用于 ...

  3. 关于MATLAB处理大数据坐标文件2017528

    第一次提交数据 增加了部分特征 3000数据测试中得分99 但是10万数据出现过拟化现象,正确率下降 总结:1.某些特征数据本身波动不大应该考虑放弃 2.一些特征虽然表面觉得差异显而易见,但是数据表达 ...

  4. iOS 转场动画探究(一)

    什么是转场动画: 转场动画说的直接点就是你常见的界面跳转的时候看到的动画效果,我们比较常见的就是控制器之间的Push和Pop,还有Present和Dismiss的时候设置一下系统给我们的modalTr ...

  5. fedora安装QQ

    只看重利益的TC根本没想到要维护和更新linux版本的QQ,所幸fedora linux的中文社区 (https://repo.fdzh.org) 对大家比较照顾,还是针对fedora做了wine Q ...

  6. php中的XML转数组

    /** * 最简单的XML转数组 * @param string $xmlstring XML字符串 * @return array XML数组 */ function simplest_xml_to ...

  7. java注解编程

  8. django-xadmin数字输入框不支持小数点小数问题

    环境:https://github.com/y2kconnect/xadmin-for-python3.git python3.5.2 django1.9.12 原因:数字输入框用的是html5 in ...

  9. Kafka 源代码分析之FileMessageSet

    这里主要分析FileMessageSet类 这个类主要是管理log消息的内存对象和文件对象的类.源代码文件在log目录下.这个类被LogSegment类代理调用用来管理分片. 下面是完整代码.代码比较 ...

  10. vue 基础-->进阶 教程(3):组件嵌套、组件之间的通信、路由机制

    前面的nodejs教程并没有停止更新,因为node项目需要用vue来实现界面部分,所以先插入一个vue教程,以免不会的同学不能很好的完成项目. 本教程,将从零开始,教给大家vue的基础.高级操作.组件 ...