(専用のサードパーティのライブラリを使用せずに)、このようなファイルを解析するための最良の方法は、正規表現のAPIを介してであり、そのフロントエンドクラスScanner
。残念ながら、Stream API経由で実装するのに最適な操作は現在ありません。すなわち、Matcher.results()
とScanner.findAll(…)
はまだありません。だから我々は、Java 9まで待ちたくない限り、我々は、Java 8の互換性ソリューションのための同様の方法を作成する必要があります。同様のセマンティックを持つメソッドを使用して
public static Stream<MatchResult> findAll(Scanner s, Pattern pattern) {
return StreamSupport.stream(new Spliterators.AbstractSpliterator<MatchResult>(
1000, Spliterator.ORDERED|Spliterator.NONNULL) {
public boolean tryAdvance(Consumer<? super MatchResult> action) {
if(s.findWithinHorizon(pattern, 0)!=null) {
action.accept(s.match());
return true;
}
else return false;
}
}, false);
}
public static Stream<MatchResult> results(Matcher m) {
return StreamSupport.stream(new Spliterators.AbstractSpliterator<MatchResult>(
m.regionEnd()-m.regionStart(), Spliterator.ORDERED|Spliterator.NONNULL) {
public boolean tryAdvance(Consumer<? super MatchResult> action) {
if(m.find()) {
action.accept(m.toMatchResult());
return true;
}
else return false;
}
}, false);
}
をJavaの後に、標準APIのメソッドとその使用法を置き換えるために私たちをことができます9がリリースされ、一般的になります。これら2つの操作を使用して
、あなたは印刷することができ、すなわち、結果のマップm
は、キー/値のペアを保持し、別のマップにグループ名からマッピングをすべての情報を保持している
Pattern groupPattern=Pattern.compile("\\[(.*?)\\]([^\\[]*)");
Pattern attrPattern=Pattern.compile("(.*?)=(.*)\\v");
Map<String, Map<String, String>> m;
try(Scanner s=new Scanner(Paths.get(context.io.iniFilename))) {
m = findAll(s, groupPattern).collect(Collectors.toMap(
gm -> gm.group(1),
gm -> results(attrPattern.matcher(gm.group(2)))
.collect(Collectors.toMap(am->am.group(1), am->am.group(2)))));
}
を使用してファイルを解析することができます使用して同等の.ini
ファイル:
m.forEach((group,attr)-> {
System.out.println("["+group+"]");
attr.forEach((key,value)->System.out.println(key+"="+value));
});
あなたの質問は不明です - 何を入れようとしていますか?行を読み込んで 'Map'(ここで 'ConfigurationBlock'はあなた自身の型です、あるいは' Properties'を使うかもしれません)を返すメソッドを書いてみたいかもしれません。 –
ストリームのない通常のスイッチステートメントで何をしたいかを表示して開始 –
質問が修正されました – elect