2013-10-09 125 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.*

相關問題