100G的文件如何读取 - 第306篇

4 篇文章 1 订阅

一、内存读取法:简单明了,不玩阴的

此方法的思路很简单,就是把文件直接读取到内存中,然后进行操作。

1.1 方法一:使用java.nio.file.Files读取文本文件

       使用Files类将文件的所有内容读入字节数组。Files类还有一个方法可以读取所有行到字符串列表。Files类是在Java 7中引入的,如果想加载所有文件内容,使用这个类是比较适合的。只有在处理小文件并且需要加载所有文件内容到内存中时才应使用此方法。

 
  1. public static void readFileByFiles(String pathname) {

  2. Path path = Paths.get(pathname);

  3. try {

  4. /*

  5. * 使用readAllLines的时候,小文件可以很快读取.

  6. * 那么更大的文件,读取的肯定会爆了。

  7. */

  8. //List<String> lines = Files.readAllLines(path);

  9. byte[] bytes = Files.readAllBytes(path);

  10. String str = new String(bytes);

  11. System.out.println(str);

  12. } catch (IOException e) {

  13. e.printStackTrace();

  14. }

  15. }

对于小文件,轻松就可以读取进来;

对于大文件就会抛出如下异常:

或者是:

结论:小文件可以使用这种方式;读取大文件,不能使用。

二、IO逐行读取法:循序渐进,好舒服

2.1 方法二:使用java.io.FileReader类

可以使用FileReader获取BufferedReader,然后逐行读取文件,FileRead也有读取char的方法,当然这样的读取方式效率很低很低了。

 
  1. public static void readFileByFileReader(String pathname) {

  2. File file = new File(pathname);

  3. FileReader fileReader;

  4. BufferedReader bufferedReader;

  5. try {

  6. fileReader = new FileReader(file);

  7. bufferedReader = new BufferedReader(fileReader);

  8. String line;

  9. StringBuffer buffer = new StringBuffer();

  10. while((line = bufferedReader.readLine()) != null){

  11. // 一行一行地处理...

  12. //System.out.println(line);

  13. //处理字符串,并不会将字符串保存真正保存到内存中

  14. // 这里简单模拟下处理操作.

  15. buffer.append(line.substring(0,1));

  16. }

  17. System.out.println("buffer.length:"+buffer.length());

  18. } catch (FileNotFoundException e) {

  19. e.printStackTrace();

  20. } catch (IOException e) {

  21. e.printStackTrace();

  22. }finally {

  23. //TODO close处理.

  24. }

  25. }

       对于大文件可以逐行读取,没啥问题,测试了下:3.46G 耗时:11秒

       注意:这里本质是使用了BufferedReader的缓冲,如果是使用的fileReader读取char的方式,那么时间会更久。

。。。。。。。。。。。。。。。。。

版权原因,完整文章,请参考如下:100G的文件如何读取 - 第306篇

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值