zoukankan      html  css  js  c++  java
  • Java利用内存映射文件实现按行读取文件

    我们知道内存映射文件读取是各种读取方式中速度最快的,但是内存映射文件读取的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 ='';
    		boolean flag = false;
    		while(out.remaining()>0){
    			byte by = out.get();
    			ch =(char)by;
    			switch(ch){
    				case '
    ':
    					flag = true;
    					break;
    				case '
    ':
    					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 这个博客值得一看,对各个读取方式的速度做了一个比较,同时自己实现了优化的方法

  • 相关阅读:
    使用transfor让图片旋转
    block与inline,inline和inline-block,块级和行内元素,行内替换和行内非替换元素
    使用classList来实现两个按钮样式的切换
    关于css透明度的问题
    级动(两级联动)思路分享
    js图片预览(一张图片预览)
    js关于密码框强弱度的提示
    javascript对象与实例
    javascript 逻辑运算符
    Raphael画圆弧
  • 原文地址:https://www.cnblogs.com/pfblog/p/7282223.html
Copyright © 2011-2022 走看看