在java中读取大型文件的最快方法

在java中读取大型文件的最快方法,java,Java,用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:

用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)

像这样的事情很难打败
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) {
  }
}

要处理大文件,您可以使用新java包中的类来处理IO
nio
包,该包提供了多种机制来管理此类文件,并具有相当高的性能


请参见

您可以这样尝试:-

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
    }
}

还要查找软件包使用Guava的
文件.readLines()
方法,您可以为该方法提供
行处理器

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 "";
    }
});
Files.readLines(新文件(“a_File.ext”)、Charsets.UTF_8、new LineProcessor(){
@凌驾
公共布尔processLine(字符串行)引发IOException{
返回行。包含(“某些标识符”);
}
@凌驾
公共字符串getResult(){//此处的@tring是LineProcessor的泛型类型,请将其更改为任意类型
//创建结果,获取一个或多个id
返回“”;
}
});

如果您使用的是Java 8,您可以使用类文件和流来尝试

例如:

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

还从

中查找和其他类前缀是否总是类似于
信息xx:yy:zz-开始执行?您有什么事吗?ppeterka没有前缀可以不同,例如test3620:1 OK 0.018如果您同时考虑到所需的行解析,那么知道这是否比BufferedReader快会很有趣。在nio中进行行解析的最佳方式是什么?@JonasKlemming:-这有助于回答您的问题:-?@JonasKlemming:-如果我遗漏了什么,也请告诉我一声?我可以寻求帮助吗用这种方法在文件中的具体位置?你的问题是你想逐行阅读文件。你所说的具体立场是什么意思?以字节或行为单位的位置?以字节为单位,我有一个二进制搜索,返回我要开始阅读的字节位置,还有一个问题,我可以用这个方法将数据插入哈希表吗?对不起,我想我误解了您的用例。若你们想要随机访问,Rahuls的答案可能更接近你们想要的。