Streamtokenizer读取非常大的数字?

时间:2013-10-06 22:21:52

标签: java input iostream largenumber

我必须在Java中输入包含大量订单10 ^ 9的输入。如何快速处理输入?此外,由于streamtokenizer.nval给出了一个double,我怎么能读取更大的值?

1 个答案:

答案 0 :(得分:0)

在解析之前,重置tokenizer语法表并初始化它以将数字识别为单词:

StreamTokenizer tokenizer = new StreamTokenizer(r);
tokenizer.resetSyntax();

tokenizer.whitespaceChars(0, 32);

tokenizer.wordChars('0', '9');
tokenizer.wordChars('-', '.');
tokenizer.wordChars('+', '+');
tokenizer.wordChars('a', 'z');
tokenizer.wordChars('A', 'Z');
tokenizer.wordChars(0xa0, 0xff); // not really needed here. */
tokenizer.slashSlashComments(true);
tokenizer.slashStarComments(true);

tokenizer.quoteChar('"');
tokenizer.quoteChar('\'');

然后,当遇到一个单词时,你会检查它是否可解析为数字(这里有点粗略,但它显示了一般的想法):

...
case StreamTokenizer.TT_WORD:
  if ("true".equals(tokenizer.sval)) {
    result = Boolean.TRUE;
  } else if ("false".equals(tokenizer.sval)) {
    result = Boolean.FALSE;
  } else if ("null".equals(tokenizer.sval)) {
    result = null;
  } else {
    try {
      result = Long.parseLong(tokenizer.sval);
    } catch(NumberFormatException e) {
      try {
        result = Double.parseDouble(tokenizer.sval);
      } catch (NumberFormatException e2) {
        throw new IllegalStateException(
           "Unexpected token: " + tokenizer.toString());
      }
   }
 }
 tokenizer.nextToken();
 break;

这是否有效取决于用例:如果你想解析表达式(而不仅仅是我的情况下的JSON),你可能不希望将+-设置为单词字符,但一般的想法应该仍然可以通过将它们视为一元运算符并在稍后阶段检测常量来实现。

相关问题