大文件读取通常使用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() ;
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值