0

我有一堆文本文件,其条目如下所示:

20662 = {
    name="Durgulel"
    dynasty=100603
    martial=7
    diplomacy=4
    intrigue=5
    stewardship=4
    learning=6
    religion="orthodox"
    culture="alan"
    trait="chaste"
    trait="arbitrary"
    trait="scholarly_theologian"
    father=41592
    992.1.1={
        birth="992.1.1"
    }
    1068.1.1={
        death="1068.1.1"
    }
}

有没有一种标准的方法可以将这样的值读取到变量中?

4

2 回答 2

1

您可以使用 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) 查找并设置成员

于 2013-11-08T01:47:38.947 回答
0

是的,有几种方法可以将文件读入程序。我建议阅读有关BufferedReader,FileReaderScanner. 有关以下内容的一些文档:

  • 文件阅读器
  • 缓冲阅读器
  • 扫描器

    我通常配对BufferedReaderFileReader因为该BuffereReader方法nextLine()对字符串变量很方便。它的实现如下:

    FileReader fr = new FileReader(fileName);
    BufferedReader br = new BufferedReader(fr);
    
    String x = br.readLine();
    

    由于文档的格式,我还建议您使用某种正则表达式来阅读您的行。将单独的单词读入String[]with的索引readLIne()和一个简单的正则表达式的一个示例是:String wH[] = br.readLine().split("\\W+");这对于根据其内容拆分每一行可能很有用,但是由于您的行似乎没有被空格分隔,所以它在readLine()某种for-loop.

    一旦您确定了您想要的确切值,您就可以将它们分配给变量。例如,假设您有一个条件可以在一行中检测到短语“name”,然后您可以将引号之后=和引号之间的值分配给所需的变量。然后冲洗并重复。

    希望这可以帮助。

  • 于 2013-11-08T01:46:29.133 回答