私は次の形式のテキストファイルを持っています。各行は文字列で始まり、一連の数字が続きます。各行の長さは不明です(未知数、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
その後私は2つの引数を受け入れるhandleLine
方法で各行を処理する必要があります:文字列の名前と設定番号(が以下のコードを参照してください)。
handleLine
でファイルを読み取り、各行を効率的に処理する方法は?
私の回避策:java8と線で
- 読むファイルの行は
Files.lines
をストリーミングします。 ブロックしていますか? - スプリット正規表現と各ライン
- ヘッダー文字列に変換各行と数字
私はそれはかなりuneffectiveによる第二と第三のステップだと思うのセット。最初のステップは、Javaがファイルバイトを文字列に変換してから2番目と3番目のステップに変換して、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