[英]Effecient way to convert a stream of Strings into grouped list of strings
我有一個將接收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(並且可能會更大),這種解決方案似乎卡在了第一行。 如果我有更多的內存,也許會完成...?
如果我的起點是Stream<String>
,是否有更好的方法來執行此操作,還是應該開始進行其他更改,以使這部分代碼可以逐行讀取文件而無需使用流API?
(在這些文件的上下文中,行的順序很重要)
TL;博士
我需要將一個表示為Stream<String>
大文件轉換成許多小文件。 每個小文件都以__HEADER__
開頭, __HEADER__
各行,直到下一個__HEADER__
。 當前的庫使用流來提供文件,但是是否值得嘗試使用流來這樣做,還是如果我將庫更改為提供非流功能,我的生活會更輕松嗎?
這扼殺了流的全部想法。
嘗試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
}
});
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.