3

在java中逐行读取大文件(文件包含1.000.000行)并解析一些行的最快方法是什么?例如这是我文件的一个片段

INFO  00:02:12 - returning228885634                                                              
INFO  00:02:12 - Step is 1 for 228885634 statusOK duration 0.018               
INFO  00:02:12 - Step is 2 for 228885634 statusOK duration 1.55                            
INFO  00:02:13 - START executing FOR  test32967 at Mon Sep 23 00:02:13 GMT+00:00 2013       
INFO  00:02:13 - Currently working 7

我只想从这个片段中解析测试的 id (32967)!

4

5 回答 5

3

你可以这样尝试:-

try (SeekableByteChannel bytechanel= Files.newByteChannel(Paths.get("abc.txt"))) {
    ByteBuffer byte1 = ByteBuffer.allocateDirect(1000);
    for(;;) {
        StringBuilder s = new StringBuilder();
        int n = bytechanel.read(byte1);
        // some code
    }
}

还要寻找java.nio.*

于 2013-10-09T19:42:02.763 回答
1

像这样的事情很难被击败BufferedReader

try {
  BufferedReader reader = new BufferedReader(new FileReader(file));
  String line = null;
  while ((line = reader.readLine()) != null) {
    //do something with line
  }
} finally {
  try {
    reader.close();
  } catch (IOException e) {
  }
}
于 2013-10-09T19:41:54.683 回答
1

使用 Guava 的Files.readLines()方法,您可以为其提供LineProcessor.

Files.readLines(new File("a_file.ext"), Charsets.UTF_8, new LineProcessor<String>() {

    @Override
    public boolean processLine(String line) throws IOException {
        return line.contains("some identifier");
    }

    @Override
    public String getResult() { // the @tring here is the generic type of LineProcessor, change it to whatever
        //create a result, get your id or ids
        return "";
    }
});
于 2013-10-09T19:43:54.743 回答
0

要处理大文件,您可以使用新的 java 包中的类来处理 IOnio包,它提供了多种机制来管理这种类型的文件,具有相当的性能。

请参阅http://docs.oracle.com/javase/7/docs/api/java/nio/channels/package-summary.html

于 2013-10-09T19:41:58.000 回答
0

如果您使用的是 Java 8,则可以使用类 Files and Streams 尝试此操作。

例如:

Files.newBufferedReader(Paths.get("somefile")).lines().map((t)-> r).collect(Collectors.toList());

还从java.nio.*中查找java.nio.files和其他类

于 2017-02-07T19:20:33.550 回答