首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >如何使用Java逐行读取大型文本文件?

如何使用Java逐行读取大型文本文件?
EN

Stack Overflow用户
提问于 2011-05-03 18:53:24
回答 17查看 1.3M关注 0票数 939

我需要使用Java逐行读取一个大约5-6 GB的大文本文件。

我怎样才能快速完成这项工作?

EN

回答 17

Stack Overflow用户

发布于 2013-07-26 02:58:39

一旦Java 8发布(2014年3月),您将能够使用streams:

代码语言:javascript
复制
try (Stream<String> lines = Files.lines(Paths.get(filename), Charset.defaultCharset())) {
  lines.forEachOrdered(line -> process(line));
}

打印文件中的所有行:

代码语言:javascript
复制
try (Stream<String> lines = Files.lines(file, Charset.defaultCharset())) {
  lines.forEachOrdered(System.out::println);
}
票数 117
EN

Stack Overflow用户

发布于 2013-03-27 12:24:44

下面是一个完整的错误处理示例,并支持Java 7之前版本的字符集规范。在Java 7中,您可以使用try- with -resources语法,这使得代码更加整洁。

如果你只需要默认的字符集,你可以跳过InputStream而使用FileReader。

代码语言:javascript
复制
InputStream ins = null; // raw byte-stream
Reader r = null; // cooked reader
BufferedReader br = null; // buffered for readLine()
try {
    String s;
    ins = new FileInputStream("textfile.txt");
    r = new InputStreamReader(ins, "UTF-8"); // leave charset out for default
    br = new BufferedReader(r);
    while ((s = br.readLine()) != null) {
        System.out.println(s);
    }
}
catch (Exception e)
{
    System.err.println(e.getMessage()); // handle exception
}
finally {
    if (br != null) { try { br.close(); } catch(Throwable t) { /* ensure close happens */ } }
    if (r != null) { try { r.close(); } catch(Throwable t) { /* ensure close happens */ } }
    if (ins != null) { try { ins.close(); } catch(Throwable t) { /* ensure close happens */ } }
}

下面是Groovy版本,包含完整的错误处理:

代码语言:javascript
复制
File f = new File("textfile.txt");
f.withReader("UTF-8") { br ->
    br.eachLine { line ->
        println line;
    }
}
票数 39
EN

Stack Overflow用户

发布于 2018-04-08 08:10:00

我记录并测试了10 different ways to read a file in Java,然后通过让它们读取从1KB到1 1GB的测试文件来对它们进行比较。以下是读取1 1GB测试文件的最快的3种文件读取方法。

请注意,在运行性能测试时,我没有向控制台输出任何内容,因为这会真正减慢测试速度。我只是想测试一下原始的阅读速度。

1) java.nio.file.Files.readAllBytes()

在Java 7、8、9中测试。总的来说,这是最快的方法。读取1 1GB文件的时间始终不到1秒。

代码语言:javascript
复制
import java.io..File;
import java.io.IOException;
import java.nio.file.Files;

public class ReadFile_Files_ReadAllBytes {
  public static void main(String [] pArgs) throws IOException {
    String fileName = "c:\\temp\\sample-1GB.txt";
    File file = new File(fileName);

    byte [] fileBytes = Files.readAllBytes(file.toPath());
    char singleChar;
    for(byte b : fileBytes) {
      singleChar = (char) b;
      System.out.print(singleChar);
    }
  }
}

2) java.nio.file.Files.lines()

这在Java 8和9中测试成功,但由于缺乏对lambda表达式的支持,它在Java 7中不起作用。读取一个1 1GB的文件大约需要3.5秒,这使得它在读取更大的文件时排在第二位。

代码语言:javascript
复制
import java.io.File;
import java.io.IOException;
import java.nio.file.Files;
import java.util.stream.Stream;

public class ReadFile_Files_Lines {
  public static void main(String[] pArgs) throws IOException {
    String fileName = "c:\\temp\\sample-1GB.txt";
    File file = new File(fileName);

    try (Stream linesStream = Files.lines(file.toPath())) {
      linesStream.forEach(line -> {
        System.out.println(line);
      });
    }
  }
}

3) BufferedReader

测试可以在Java 7、8、9下运行。读取一个1 1GB的测试文件大约需要4.5秒。

代码语言:javascript
复制
import java.io.BufferedReader;
import java.io.FileReader;
import java.io.IOException;

public class ReadFile_BufferedReader_ReadLine {
  public static void main(String [] args) throws IOException {
    String fileName = "c:\\temp\\sample-1GB.txt";
    FileReader fileReader = new FileReader(fileName);

    try (BufferedReader bufferedReader = new BufferedReader(fileReader)) {
      String line;
      while((line = bufferedReader.readLine()) != null) {
        System.out.println(line);
      }
    }
  }

你可以找到所有10种文件读取方法here的完整排名。

票数 23
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/5868369

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档