Java Streamtokenizer是否可以读取非常大的数字?

Java Streamtokenizer是否可以读取非常大的数字?,java,input,iostream,largenumber,Java,Input,Iostream,Largenumber,我必须在Java中获取一个包含大量10^9阶的输入。如何快速处理输入?另外,由于streamtokenizer.nval提供了一个双精度值,我如何读取更大的值 在解析之前,重置标记器语法表并对其进行初始化,以将数字识别为单词: StreamTokenizer tokenizer = new StreamTokenizer(r); tokenizer.resetSyntax(); tokenizer.whitespaceChars(0, 32); tokenizer.wordChars('0'

我必须在Java中获取一个包含大量10^9阶的输入。如何快速处理输入?另外,由于streamtokenizer.nval提供了一个双精度值,我如何读取更大的值

在解析之前,重置标记器语法表并对其进行初始化,以将数字识别为单词:

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('\'');
然后,当遇到一个单词时,检查它是否可以解析为一个数字(这里有点粗糙,但它显示了总体思路):


这是否有效取决于用例:如果您想解析表达式(而不是像我的例子那样只解析JSON),您可能不想将
+
-
设置为单词字符,但是一般的想法应该仍然有效,将它们作为一元运算符处理,并在稍后阶段检测常量。

您可以尝试
BigDecimal
,这对获取输入没有帮助。在从double转换为BigInteger.1时两者都不适用。您可以将输入作为
字符串
传递给
BigDecimal
构造函数;2.从
double
转换为
BigInteger
没有意义,因为它是用于整数的,而且因为太大的值不能用
double
表示,所以您会转换错误的值。@不必使用反斜杠BigInteger–即使是32位int也可以处理10^9阶的数字。
...
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;