我们知道内存映射文件读取是各种读取方式中速度最快的,但是内存映射文件读取的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. net core 程序docker打包镜像并发布到官方store

    学习一个技术的第一步,总是要先打印或显示一个hello world的.当然,学习docker也不例外.上一篇文章已经简单的介绍了环境的安装和配置.接下来就要打印我们的hello world了. 首先我 ...

  2. 自定义分布式RESTful API鉴权机制

    微软利用OAuth2为RESTful API提供了完整的鉴权机制,但是可能微软保姆做的太完整了,在这个机制中指定了数据持久化的方法是用EF,而且对于用户.权限等已经进行了封装,对于系统中已经有了自己的 ...

  3. PHPCMS v9点击量增加值加大的方法

    PHPCMS v9点击量增加值加大的方法 在根目录/api 50行 $views = $r['views'] + 1; 修改数字1即可修改每次刷新页面点击量增加的数值.

  4. phpcms v9模版调用代码

    首页调用栏目{pc:content action="category" siteid="$siteid" num="15" order=&q ...

  5. Redis中的数据对象

    redis对象 redis中有五种常用对象 我们所说的对象的类型大多是值的类型,键的类型大多是字符串对象,值得类型大概有以下几种,但是无论哪种都是基于redisObject实现的 redisObjec ...

  6. 30岁程序员的选择,一线OR二线?

    作为一个30刚出头的IT行业从业者,先介绍下我自己的情况.虽然不具有代表性,但是也可以作为一个参考.本人08年本科毕业于一所还算不错的211大学计算机专业(04年去的时候综合排名38,毕业走时排名45 ...

  7. AI相关 TensorFlow -卷积神经网络 踩坑日记之一

    上次写完粗浅的BP算法 介绍 本来应该继续把 卷积神经网络算法写一下的 但是最近一直在踩 TensorFlow的坑.所以就先跳过算法介绍直接来应用场景,原谅我吧. TensorFlow 介绍 TF是g ...

  8. div自身高度、屏幕高度

    获取元素高度 scrollWidth    //显示当前元素的宽度 scrollHeight   //显示当前元素的高度 scrollLeft     //显示当前元素的左边距左侧的距离 scroll ...

  9. 从Java熟练到Android入门

    刚刚从学校出来,唉,从Java转入Android. 当初老师告诉我们Android不重要,结果,Android的所有课不是在玩手机就是在说话,没认真听也没认真看,作业也没认真做,现在想想好后悔啊,以至 ...

  10. ASP.NET MVC Autofac依赖注入的一点小心得(包含特性注入)

    前言 IOC的重要性 大家都清楚..便利也都知道..新的ASP.NET Core也大量使用了这种手法.. 一直憋着没写ASP.NET Core的文章..还是怕误导大家.. 今天这篇也不是讲Core的 ...