2016-09-21 142 views
1

我有一個函數將會收到Stream<String>。該流表示文件中的行(由Files.lines(somePath)調用)。文件本身實際上是許多文件拼接成一個文件,這樣的事情:將字符串流轉換爲字符串分組列表的有效方法

 
__HEADER__ # for file 1 
data 
more data 
... 
__HEADER__ # file 2 starts here 
some more data... 
... 

我需要將流轉換爲多個物理文件上的文件系統。

我已經嘗試了簡單的辦法,沿着線的東西:

String allLinesJoined = lineStream.collect(Collectors.joining()); 
// This solution seems to get stuck on the line above^
String files[] = allLinesJoined.split("__HEADER__"); 
for (fileStr : files) 
{ 
    // This function will write each fileStr to a separate file 
    // (filename is determined by contents of fileStr) 
    writeToPhysicalFile(fileStr); 
} 

但輸入文件是約〜300 MB(並能得到較大),這解決方案似乎停留在第一個GET線。如果我有更多的記憶,也許它會完成......?

如果我的出發點是Stream<String>,還是應該開始進行其他更改,以便這部分代碼只需逐行讀取文件,而無需使用流API,那麼還有更好的方法嗎?

(該行的順序此事確實,在這些文件中的上下文中)

TL;博士

我需要打開表示爲Stream<String>一個大文件中的許多小文件。每個小文件以__HEADER__和所有行後開頭,直到下一個__HEADER__。當前的庫使用流提供文件,但它甚至值得試圖用流來做到這一點,或者如果我改變庫以提供非流功能,我的生活會更容易嗎?

+0

基於衝突的答案可能有一些混亂,你的最終目標是什麼(至少我很困惑)。我理解這個問題,但不是理想的解決方案 –

+1

@ChrisThompson:我也意識到了這一點,並且我認爲我的最新編輯更加清晰。 – FrustratedWithFormsDesigner

+0

流是_really_不是爲此設計的。它們專爲不關心流如何單獨分塊的操作而設計。 –

回答

2

殺死了整個流的想法。

嘗試的forEach():

Stream<String> lineStream = Files.lines(Paths.get("your_file")); 

    lineStream.forEachOrdered((s) -> { 
     if ("HEADER".equals(s)) { 
      // create new file 
     } 
     else { 
      // append to this file 
     } 
    }); 
+0

是的,它並不適用於流的思想,但基於此我可以很好地工作,它比重寫底層代碼更快,並且它的表現也非常好。 :) – FrustratedWithFormsDesigner

+1

不是我親自批評你,無論如何!如果每個人都知道所有的解決方案,那麼不會有StackOverflow開始。 –

相關問題