多线程 + java nio 实现按行读取并处理超大文件

本文介绍了如何结合Java NIO和多线程来提高读取处理大文件的性能。通过创建一个文件读取工具类,设置线程数量和缓冲区大小,将文件分段读取,每个线程处理一部分内容,然后通过预定义的数据处理接口进行数据处理。具体实现包括文件读取工具类、数据处理接口及其实现,以及一个简单的启动示例。
摘要由CSDN通过智能技术生成

之前通过 java nio 实现了按行读写文件的方法,但由于是单线程读写,所以当读取数据量比较大的文件时性能肯定会是个大问题,所以为了解决读取处理大文件时性能上的问题,就在原来按行读取文件的基础上增加了多线程的实现,并使用线程来进行线程调度,思路和其它相关博客都一样,只是在代码实现的方式上有所区别,整体思路就是根据初始化线程数量来将文件进行分段读取,一个线程读取一个片段的内容,然后将读取到的行数据交由事先注册的处理接口来进行处理。具体代码如下:
1.文件读取工具类:文件读取的具体实现类,提供读取文件的入口
/**
* 多线程按行读取文件工具类
* @author zyh
*
*/
public class FileReader {
private int threadNum = 3;//线程数,默认为3
private String filePath;//文件路径
private int bufSize = 1024;//缓冲区大小,默认为1024
private DataProcessHandler dataProcessHandler;//数据处理接口
private ExecutorService threadPool;

public FileReader(String filePath,int bufSize,int threadNum){
    this.threadNum = threadNum;
    this.bufSize = bufSize;
    this.filePath = filePath;
    this.threadPool = Executors.newFixedThreadPool(threadNum);
}

/**
 * 启动多线程读取文件
 */
public void startRead(){
    FileChannel infile = null;
    try {
        RandomAccessFile raf = new RandomAccessFile(filePath,"r");
        infile = raf.getChannel();
        long size = infile.size();
        long subSize = size/threadNum;
        for(int i = 0; i < threadNum; i++){
            long startIndex = i*subSize;
            if(size%threadNum > 0 && i == threadNum - 1){
                subSize += size%threadNum;
            }
评论 14
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值