文档章节

Java 多线程处理大文本文件

李岩飞
 李岩飞
发布于 2018/06/29 13:49
字数 408
阅读 324
收藏 0

对于文本文件,大部分都是一个线程处理一个文件,如果文本文件比较大,没找到类似如果多线程处理一个文本文件的方式。针对大文件的处理,写入如下代码,感觉不是太好,希望大神们指正。

package net.dotool.demo;

import java.io.IOException;
import java.io.RandomAccessFile;
import java.nio.ByteBuffer;
import java.nio.channels.FileChannel;
import java.nio.charset.Charset;
import java.util.concurrent.CountDownLatch;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;

import net.dotool.IoTools;

public class BigFileDealMain {
	static ExecutorService pool = Executors.newFixedThreadPool(2);
	static CountDownLatch count = new CountDownLatch(2);

	public static void main(String[] args) {
		FileChannel fc = null;
		try {
			fc = new RandomAccessFile("F:\\logs\\server.log.2018-06-07-14", "r").getChannel();
			long t = System.currentTimeMillis();
			for (int i = 0; i < 2; i++) {
				pool.execute(new ReadThread(fc));
			}
			count.await();
			pool.shutdown();
			System.out.println(System.currentTimeMillis() - t);
		} catch (Exception e) {
			e.printStackTrace();
		} finally {
			IoTools.close(fc);
		}
	}

	public static synchronized ByteBuffer read(FileChannel fc) {
		ByteBuffer bb = ByteBuffer.allocate(4096);
		try {
			if (fc.position() >= fc.size())
				return null;
			fc.read(bb);
			bb.flip();
			long filePosition = fc.position();
			int lastN = 0;
			int nowLimit = bb.limit();
			for (int p = nowLimit - 1; p > 0; p--) {
				bb.position(p);
				if ('\n' == bb.get()) {
					lastN = p + 1;
					break;
				}
			}
			bb.position(0);
			bb.limit(lastN);
			if (lastN > 0)
				fc.position(filePosition - (nowLimit - lastN));
		} catch (IOException e) {
			e.printStackTrace();
		}
		return bb;
	}

	public static class ReadThread implements Runnable {
		FileChannel fc;

		public ReadThread(FileChannel fc) {
			this.fc = fc;
		}

		@Override
		public void run() {
			ByteBuffer bb = null;
			while ((bb = read(fc)) != null) {
				int lastP = 0;
				while (bb.hasRemaining()) {
					if ('\n' == bb.get()) {
						int nowP = bb.position();
						bb.position((int) lastP);
						int len = nowP - lastP;
						byte[] b1 = new byte[len > 2 ? len - 2 : len];
						bb.get(b1);
						lastP = nowP;
						if (len > 2) {//最后一两个字节是\r\n ,不同的系统可能换行符不同,
							bb.get();
							bb.get();
						}
						String str = new String(b1, Charset.forName("gbk"));
						System.out.println(str);
					}
				}
			}
			count.countDown();
		}
	}
}

 

© 著作权归作者所有

李岩飞
粉丝 63
博文 5
码字总数 4086
作品 1
北京
后端工程师
私信 提问
java 调用exe程序挂起

最近在做一个java工具,java多线程执行bat文件, 每个bat文件又会调用两个exe文件(a.exe | b.exe)。 每一个线程单独执行一个bat文件。线程执行bat文件。 因为数据量很大,活执行很多次bat...

ifso
2015/07/23
540
1
你必须掌握的 21 个 Java 核心技术!(干货)

点击上方“java进阶架构师”,选择右上角“置顶公众号” 20大进阶架构专题每日送达 51闲来无事,师长一向不(没)喜(有)欢(钱)凑热闹,倒不如趁着这时候复盘复盘。而写这篇文章的目的是想...

Java进阶架构师
05/03
0
0
java中使用多线程不能明显提高程序效率的一些原因.

java中使用多线程不能明显提高程序效率的一些原因. 使用多个线程来处理多任务的时候,效率肯定是有提高的.但是必须要慎用,否则容易出现问题. 1.多线程主要是为了充分利用多核cpu,大内存这些资...

Zhao-Qian
2012/08/15
3.4K
2
你分得清分布式、高并发与多线程吗?

当提起这三个词的时候,是不是很多人都认为分布式=高并发=多线程? 当面试官问到高并发系统可以采用哪些手段来解决,或者被问到分布式系统如何解决一致性的问题,是不是一脸懵逼? 确实,在一...

宋庆离
01/17
2.2K
0
Java编程基础知识点和技术点归纳

Java是一种可以撰写跨平台应用软件的面向对象的程序设计语言。Java 技术具有卓越的通用性、高效性、平台移植性和安全性,广泛应用于PC、数据中心、游戏控制台、科学超级计算机、移动电话和互...

Java小辰
2018/05/23
0
0

没有更多内容

加载失败,请刷新页面

加载更多

java 三元表达式

例子:C=A>B ? 100 :200; 这条语句的意思是,如果A>B的话,就将100赋给C,否则就将200赋给C;

无名氏的程序员
21分钟前
3
0
针对回流和重绘的渲染优化--公司分享

如果是你,你会如何实现浏览器内核,你认为的浏览器渲染的流程是怎么样的 工作开发中,你有做过哪些关于性能优化的工作(代码),或者目前的业务中有哪些是可以做优化的 浏览器渲染机制 什么...

莫西摩西
33分钟前
3
0
html:常见行内标签,常见块级标签,常见自闭合标签

本文转载于:专业的前端网站▷html:常见行内标签,常见块级标签,常见自闭合标签 本文内容: 常见行内标签 常见块级标签 常见自闭合标签 首发日期:2018-02-12 修改: 2018-04-25:删除了不常用...

前端老手
41分钟前
3
0
终日乾乾,含章可贞@20191017

工龄7年,7年里换了两家公司,一次被动,一次主动。一次被动只有暖,一次主动冷暖皆有。第一次,只有遗憾,没有珍惜那段时光。第二次细说一下: 一、老公司 1、离职前,甲方三种态度:恭喜、...

sunny小喵
今天
4
0
zk中leader和follower启动时信息交互

QuorumPeer中读取节点状态信息,不同状态下设置不同角色 1 Leader启动Follower接收器LearnerCnxAcceptor LearnerCnxAcceptor负责接收非leader连接请求,线程中创建LearnerHandler处理器 2 Le...

writeademo
今天
6
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部