2013-10-05 43 views
0

我想收到一些關於我將在Java中解決的一些小問題的建議。在Java中將大文本文件解析爲塊

我有包括以下格式的文件:

@ 
some text 
some text 
some text 

@ 
some text 
some text 
some text 

@ 
some text 
some text 
some text 

...等等。

我需要讀取該文本文件的下一個塊,然後創建一個InputStream對象來讀取塊的const並將InputStream對象傳遞給解析器。我必須爲文本文件中的每個塊重複這些操作。每個塊都寫在以@開頭的行之間。問題是使用應該從InputStream讀取每個塊的解析器來解析@標籤之間的每個部分。

該文本文件可能很大,所以我想獲得良好的性能。

我該如何解決這個問題?

我曾經想過做這樣的事情:

FileReader fileReader = new FileReader(file); 

    BufferedReader bufferedReader = new BufferedReader(fileReader); 

    Scanner scanner = new Scanner(bufferedReader); 

    scanner.useDelimiter("@"); 

    List<ParsedChunk> parsedChunks = new ArrayList<ParsedChunk>(); 

    ChunkParser parser = new ChunkParser(); 

    while(scanner.hasNext()) 
    { 
     String text = scanner.next(); 

     InputStream inputStream = new ByteArrayInputStream(text.getBytes("UTF-8")); 

     ParsedChunk parsedChunk = parser.parse(inputStream); 

     parsedChunks.add(parsedChunk); 

     inputStream.close(); 
    } 

    scanner.close(); 

,但我不知道這是否會做一個很好的方式。

謝謝。

+0

很難理解該文件的格式。另外,如果您希望在帖子中使用正確的格式標記。 –

+0

在開始優化之前,您應該測量問題所在。在許多系統中,限制性的事實是讀取文件並分解成行的時間。在這種情況下,您可能會嘗試加速最快的一點。 –

+3

是downvoters需要從他們的錢包支付給予理由?他們爲什麼不發表評論? – SpringLearner

回答

0

如果我理解正確。這是你正在努力實現的。僅供參考,您將需要Java 7中得到下面的代碼運行

public static void main(String[] args) throws IOException { 
    List<String> allLines = Files.readAllLines(new File("d:/input.txt").toPath(), Charset.defaultCharset()); 
    List<List<String>> chunks = getChunks(allLines); 
    //Now you have all te chunks and you can process them 
} 

private static List<List<String>> getChunks(List<String> allLines) { 
    List<List<String>> result = new ArrayList<List<String>>(); 
    int i = 0; 
    int fromIndex = 1; 
    int toIndex = 0; 
    for(String line : allLines){ 
     i++; 
     if(line.startsWith("****") && i != 1){ // To skip the first line and the check next delimiter 
      toIndex = i-1;   
      result.add(allLines.subList(fromIndex, toIndex)); 
      fromIndex = i; 
     } 
    } 
    return result; 
} 
0

didnt完全得到的問題但你可以嘗試使用焦炭在這一刻,存儲所有字符的字符數組&去thhrough循環& condiional聲明每次遇到'@'時都會打斷該字符串