您可以使用 StreamTokenizer;应该看起来大致像这样(未经测试):
static Map<String,Object> parse(
StreamTokenizer tokenizer, int endToken) throws IOException {
Map<String,Object> result = new TreeMap<String,Object>();
while (tokenizer.nextToken() != endToken) {
String key = tokenizer.sval;
if (tokenizer.nextToken() != '=') {
throw new RuntimeException("'=' expected");
}
if (tokenizer.nextToken() == '{') {
result.put(key, parse(tokenizer, '}'));
} else {
tokenizer.nextToken();
result.put(key, tokenizer.sval);
}
}
return result;
}
static void main(String[] args) throws IOException {
Reader reader = new FileReader(args[0]);
Map<String,Object> parsed = parse(
new StreamTokenizer(reader), StreamTokenizer.TT_EOF);
System.out.println(parsed);
}
ps 这将需要对 922.1.1 和类似密钥进行一些额外的处理。如果格式真的只是基于行的,使用 BufferedReader.readLine()、trim() 并检查 { / } / = 可能更直接
pps 如果变量是指实例成员变量,则可以使用 Java 反射 API 相应地设置它们(而不是像示例中那样读取映射)。您将提交要填充的对象,然后通过 object.getClass().getField(key).set(object, value) 查找并设置成员