网上基本使用readline读取,这样一行行读取太慢了.
我也看了好多使用apache-common包读取的. 也不是那么的快.
这里提供一种并行流的方式.仅供参考
你如果有更高效的读取方式,请在下方留言. 我真的需要…谢谢
将文件 读取为BufferedReader, 然后使用java8的并行流读取, 注意, 并行流不是线程安全的;
废话不多说, 上代码
```java
import cn.hutool.core.date.DateUtil;
import cn.hutool.core.date.TimeInterval;
import cn.hutool.core.io.FileUtil;
import cn.hutool.core.io.IoUtil;
import org.apache.commons.compress.utils.Lists;
import java.io.BufferedReader;
import java.io.File;
import java.io.FileInputStream;
import java.util.Collection;
import java.util.Collections;
import java.util.stream.Stream;
import static com.example.mytest.test.Constant.bigCSV_50W;
/**
* 多线程读取CSV
*
* @author: riyueming
* @date: 2021/8/2
* @description:
*/
public class CsvThreadTest {
/**
* 多线程读取文件测试
*
* @param args
*/
public static void main(String[] args) {
TimeInterval timer = DateUtil.timer();
//并行流 没有数据安全,需要synchronized
Collection<Object> objects = Collections.synchronizedCollection(Lists.newArrayList());
File touch = FileUtil.touch("D:/data/unitedata/local/ftp_1.csv");
FileInputStream fileInputStream = IoUtil.toStream(touch);
BufferedReader utf8Reader = IoUtil.getUtf8Reader(fileInputStream);
Stream<String> lines = utf8Reader.lines();
lines.parallel().forEach(s ->
{
objects.add(s);
}
);
System.out.println(objects.size());
System.out.println("-----执行结束-----" + timer.interval()+"ms");
}
}```
其中"D:/data/unitedata/local/ftp_1.csv" 的数据量为50W条左右. 大小9M左右
其中内容只有一列uuid
运行效果:
再测试下 1000W的数据,结果如下
我已经测试过1000W 数据量,
如果使用readline读取 大约10s左右.
使用apache-common读取大约是8s左右.
最后提供上述代码使用了 hutool工具包
<dependency>
<groupId>cn.hutool</groupId>
<artifactId>hutool-all</artifactId>
<version>5.6.5</version>
</dependency>