文档章节

FileChannel按行读取文本

温佐镜
 温佐镜
发布于 2014/09/25 08:11
字数 226
阅读 160
收藏 1

大文件读取一般使用FileChannel,本文介绍FileChannel按行读取文本实例

辅助类

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() ;



© 著作权归作者所有

上一篇: json属性过滤
温佐镜
粉丝 11
博文 32
码字总数 11554
作品 0
广州
程序员
私信 提问
Java NIO 之 Channel(通道)

历史回顾: Java NIO 概览 Java NIO 之 Buffer(缓冲区) 其他高赞文章: 面试中关于Redis的问题看这篇就够了 一文轻松搞懂redis集群原理及搭建与使用 一 Channel(通道)介绍 通常来说NIO中的所...

山川_84b6
2018/05/15
0
0
以字节的方式(写入,读取)文本,以字符的方式(写入,读取)文本和的写入,读取

java NIO从一个文件写到另一个文件 /** *通道之间的数据传输 * transferFrom()方法将数据源从通道传输到FileChannel中 * @throws IOException */ @Test public void transferFrom() throws I...

1527
2016/05/08
89
0
Java NIO之FileChannel

Java NIO中的FileChannel是一个连接到文件的通道。可以通过文件通道读写文件。 FileChannel无法设置为非阻塞模式,它总是运行在阻塞模式下。 打开FileChannel 在使用FileChannel之前,必须先...

双月通天
2016/01/26
63
0
Java NIO系列教程(七) FileChannel

原文链接 作者:Jakob Jenkov Java NIO中的FileChannel是一个连接到文件的通道。可以通过文件通道读写文件。 FileChannel无法设置为非阻塞模式,它总是运行在阻塞模式下。 打开FileChannel 在...

_夏天的风_
2013/07/11
159
0
RandomAccessFile操作文件

RandomAccessFile是一个很有用的类,可以将字节流写入到磁盘文件中,对应的也可以从磁盘文件中读取出字节流,在API中关于RandomAccessFile的描述如下: 此类的实例支持对随机访问文件的读取和...

xiahuawuyu
2012/06/25
863
0

没有更多内容

加载失败,请刷新页面

加载更多

前端面试题汇总

一. HTML常见的兼容性 1.HTML5 标签在低版本浏览器不兼容 解决办法:使用html5shiv库,引入下列语句 <!--[if lte IE 8]> <script src="https://cdn.bootcss.com/html5shiv/r29/html5.js"></sc......

蓝小驴
18分钟前
3
0
OSChina 周四乱弹 —— 我气的脸都黑了!

Osc乱弹歌单(2019)请戳(这里) 【今日歌曲】 小小编辑推荐《Red Battle》- 高橋李依 / 豊崎愛生 《Red Battle》- 高橋李依 / 豊崎愛生 手机党少年们想听歌,请使劲儿戳(这里) @丶Lion ...

小小编辑
31分钟前
381
18
找OSG教程, B站就有

https://www.bilibili.com/video/av64849038?from=search&seid=11632913960900279653

洛克人杰洛
52分钟前
4
0
学习记录(day07-Vue组件、自定义属性、自定义事件)

[TOC] 1.1.1什么是组件 一个vue文件就是一个组件 组件将html标签/css样式/对应JS打包成一个整体,也可以理解钻进一个具有样式和特效的自定义标签。 一、编写组件(提供方)<template> <di...

庭前云落
57分钟前
4
0
使用Prometheus监控SpringBoot应用

通过之前的文章我们使用Prometheus监控了应用服务器node_exporter,数据库mysqld_exporter,今天我们来监控一下你的应用。(本文以SpringBoot 2.1.9.RELEASE 作为监控目标) 编码 添加依赖 使...

JAVA日知录
59分钟前
6
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部