码农知识堂 - 1000bd
  •   Python
  •   PHP
  •   JS/TS
  •   JAVA
  •   C/C++
  •   C#
  •   GO
  •   Kotlin
  •   Swift
  • 大文件读取通常使用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() ;
  • 相关阅读:
    聊聊动态线程池的9个场景
    C++ 内存池
    网易云音乐下载的歌曲能永久听吗?超级简单!
    阿里巴巴微服务架构中模块和模块之间的方法调用一般用什么方式?
    08.初级指针
    彻底解决electron-builder安装问题与npm下载配置问题
    阿里云验证SSL证书
    TYPE-C接口桌面显示器:视频与充电的双重革新
    聊聊室内导航在应用方面
    小白兔快开门,我是你爸爸。WEB安全基础入门—访问控制漏洞和权限提升
  • 原文地址:https://blog.csdn.net/heikeb/article/details/127429746
  • 最新文章
  • 攻防演习之三天拿下官网站群
    数据安全治理学习——前期安全规划和安全管理体系建设
    企业安全 | 企业内一次钓鱼演练准备过程
    内网渗透测试 | Kerberos协议及其部分攻击手法
    0day的产生 | 不懂代码的"代码审计"
    安装scrcpy-client模块av模块异常,环境问题解决方案
    leetcode hot100【LeetCode 279. 完全平方数】java实现
    OpenWrt下安装Mosquitto
    AnatoMask论文汇总
    【AI日记】24.11.01 LangChain、openai api和github copilot
  • 热门文章
  • 十款代码表白小特效 一个比一个浪漫 赶紧收藏起来吧!!!
    奉劝各位学弟学妹们,该打造你的技术影响力了!
    五年了,我在 CSDN 的两个一百万。
    Java俄罗斯方块,老程序员花了一个周末,连接中学年代!
    面试官都震惊,你这网络基础可以啊!
    你真的会用百度吗?我不信 — 那些不为人知的搜索引擎语法
    心情不好的时候,用 Python 画棵樱花树送给自己吧
    通宵一晚做出来的一款类似CS的第一人称射击游戏Demo!原来做游戏也不是很难,连憨憨学妹都学会了!
    13 万字 C 语言从入门到精通保姆级教程2021 年版
    10行代码集2000张美女图,Python爬虫120例,再上征途
Copyright © 2022 侵权请联系2656653265@qq.com    京ICP备2022015340号-1
正则表达式工具 cron表达式工具 密码生成工具

京公网安备 11010502049817号