我有一個下一個格式的文本文件:每一行都以字符串開頭,後面跟着數字序列。每行有未知長度(未知數量,數量從0到1000)。有效的方法來讀取文件和解析每一行
string_1 3 90 12 0 3
string_2 49 0 12 94 13 8 38 1 95 3
.......
string_n 9 43
之後我必須處理好與handleLine
方法,它接受兩個參數的每一行:字符串名稱並設置數(見下文代碼)。
如何讀取文件並有效地處理每一行handleLine
?
我的解決方法:
- 逐行讀取文件中的行與java8流
Files.lines
。 它阻塞了嗎? - 拆分與正則表達式的每一行
- 將每個行成頭字符串,並設置數字
我認爲這是非常uneffective由於第二和第三個步驟。第一步意味着java將文件字節先轉換爲字符串,然後在第二步和第三步中將其轉換回String
/Set<Integer>
。 這會影響性能嗎?如果是 - 如何做得更好?
public handleFile(String filePath) {
try (Stream<String> stream = Files.lines(Paths.get(filePath))) {
stream.forEach(this::indexLine);
} catch (IOException e) {
e.printStackTrace();
}
}
private void handleLine(String line) {
List<String> resultList = this.parse(line);
String string_i = resultList.remove(0);
Set<Integer> numbers = resultList.stream().map(Integer::valueOf).collect(Collectors.toSet());
handleLine(string_i, numbers); // Here is te final computation which must to be done only with string_i & numbers arguments
}
private List<String> parse(String str) {
List<String> output = new LinkedList<String>();
Matcher match = Pattern.compile("[0-9]+|[a-z]+|[A-Z]+").matcher(str);
while (match.find()) {
output.add(match.group());
}
return output;
}
正如建議,也許移動Pattern.compile這種方法之外,我認爲你不需要爲每一行編譯相同的模式。 – eg04lt3r