• 大文件读取通常使用FileChannel,本文介绍FileChannel按行读取文本实例 java


    大文件读取通常使用FileChannel,本文介绍FileChannel按行读取文本实例 java

    辅助类 dom

    public class FileReader {
    
    	private FileChannel fileChanne;
    
    	private String charset;
    
    	private ByteBuffer byteBuffer;
    
    	private int bufferSize;
    
    	public FileReader(FileChannel fileChannel, int bufferSize, String charset) {
    		this.fileChanne = fileChannel;
    		this.charset = charset;
    		this.bufferSize = bufferSize;
    		// byteBuffer = ByteBuffer.allocate(bufferSize) ;
    	}
    
    	public String readline() throws IOException {
    
    		if (byteBuffer == null) {
    			byteBuffer = ByteBuffer.allocate(bufferSize);
    
    			int len = fileChanne.read(byteBuffer);
    
    			if (len == -1)
    				return null;
    
    			byteBuffer.flip();
    		}
    
    		byte[] bb = new byte[bufferSize];
    
    		int i = 0;
    
    		while (true) {
    
    			while (byteBuffer.hasRemaining()) {
    
    				byte b = byteBuffer.get();
    
    				if ('\r' == b || '\n' == b) {
    
    					if (byteBuffer.hasRemaining()) {
    						byte n = byteBuffer.get();
    
    						if ('\n' != n) {
    							byteBuffer.position(byteBuffer.position() - 1);
    						}
    
    					} else {
    
    						byteBuffer.clear();
    
    						int len = fileChanne.read(byteBuffer);
    
    						byteBuffer.flip();
    
    						if (len != -1) {
    							byte n = byteBuffer.get();
    
    							if ('\n' != n) {
    								byteBuffer.position(byteBuffer.position() - 1);
    							}
    						}
    
    					}
    
    					return new String(bb, 0, i, charset);
    
    				} else {
    
    					if (i >= bb.length) {
    
    						bb = Arrays.copyOf(bb, bb.length + bufferSize + 1);
    					}
    
    					bb[i++] = b;
    				}
    
    			}
    
    			byteBuffer.clear();
    			int len = fileChanne.read(byteBuffer);
    			byteBuffer.flip();
    
    			if (len == -1 && i == 0) {
    				return null;
    			}
    
    		}
    
    	}
    
    	public void close() throws IOException {
    		this.fileChanne.close();
    	}
    
    }

    使用例子

    FileChannel fileChannel  = new RandomAccessFile("/bigfile", "r").getChannel();
    		 
    		 FileReader fileReader = new FileReader(fileChannel, 1024, "utf-8") ;
    		 String line ;
    		 
    		 while(  ( line = fileReader.readline() ) != null ){
    			 
    			 System.out.println(line );
    			 
    		 }
    		 
    		 
    		 fileReader.close() ;
  • 相关阅读:
    早在多久MySQL 啥时候用表锁,啥时候用行锁?
    recovery菜单选项,添加风险提示弹框
    Oracle 11g+PLSQL Developer安装及环境配置
    全网最全谷粒商城记录_10、环境-docker安装mysql
    C# List 复制之深浅拷贝
    BSV 上的点对点结算衍生品:远期合约
    gRPC-Java
    VMware硬盘类型厚置备延迟置零 、 厚置备置零、精简置备的区别
    coq程序编写好用的IDE推荐
    Java练习题第二十七期:幸运的袋子
  • 原文地址:https://blog.csdn.net/heikeb/article/details/127429746