2013-10-09 81 views
3

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

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

+0

是前缀总是喜欢'INFO XX:YY:ZZ - 开始执行FOR'? – ppeterka

+0

对[线索](http://arashmd.blogspot.com/2013/06/java-threading.html)有任何意见吗? – 2013-10-09 19:44:26

+0

ppeterka否前缀可以不同,例如test3620:1正常0.018 – user2842269

回答

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) { 
    } 
} 
+0

我需要将文件从一个具体位置读到另一个位置 – user2842269

+0

您的问题表明您想逐行读取文件。你具体的位置是什么意思?以字节或行为单位的位置? –

+0

以字节为单位,我有一个二进制搜索,它返回从我想从哪里开始读取的字节位置 – user2842269

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.*

+1

当您也考虑到所需的行解析时,知道这是否比BufferedReader更快会很有趣。 –

+0

在nio中进行行解析的最佳方式是什么? –

+0

@JonasKlemming: - 这有助于回答您的查询: - http://technicalmumbojumbo.wordpress.com/2011/03/17/file-io-old-io-or-nio-which-is-better/? –

1

利用番石榴的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 ""; 
    } 
}); 
0

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

例如:

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

也寻找java.nio.files和其他类从java.nio.*

相关问题