如何使用Java PushbackInputStream读取数字

时间:2012-01-31 23:04:43

标签: java

我需要从PushbackInputStream读取一个数字(可以是整数,双数,正数,负数等)。我是否必须逐字节读取并测试它们是否在0-9和测试分隔空间之间?

或者如何使用空格作为分隔将流中的其余部分读入String数组?

修改

让我让自己更清楚一些。我想做一些涉及运算符和数字的表达式解析。我可能(如果不是,你的好方法是什么?)每当我遇到一个数字的一​​部分而不是操作符时需要使用PushbackInputStream,因为在这种情况下我会读取/推回该部分的数字我只是误读了。例如,我想解析“10 + 20 * 30”,我读1,这不在我的运算符的enum中,我把它放回去,尝试读取{的{ {1}}。那么怎么做呢?

2 个答案:

答案 0 :(得分:1)

您可以将Scanner类用于此目的。

http://docs.oracle.com/javase/7/docs/api/java/util/Scanner.html

使用此代码从PushbackInputStream中读取一个名为 psi 的整数:

 Scanner sc = new Scanner(_psi_);
 int i = sc.nextInt();

扫描仪还具有读取其他数据类型的方法。如果你想从文本文件中读取(小)未知数量的int,你可以使用这样的东西:

Scanner sc = new Scanner(_psi_);
List<Integer> ints = new ArrayList<Integer>();
while(sc.hasNextInt())
  ints.add(sc.nextInt());

Integer[] theIntArray = ints.toArray(new Integer[]);

编辑:作为替代方案,您可以阅读单个字符(我会使用InputStreamReader)并检查您是否有一部分数字。如果它是数字的一部分,则将当前char附加到String(*)的末尾。当您看到一个运算符时,请使用Integer.parseInt()一次解析String。

(*)通过附加单个字符来构建字符串是不好的做法,因为它非常慢。使用StringBuilder通常是更好的选择。

答案 1 :(得分:0)

您可以这样阅读PushbackInputStream

byte buf[]; // some buffer
ByteArrayInputStream in = new ByteArrayInputStream(buf);
PushbackInputStream f = new PushbackInputStream(in);
int c;
while ((c = f.read()) != -1) {
    if (Character.isDigit(c)) {
    int d = f.read();
    if (matchesSomeCondition(d)) {
        doSomethingInteresting(c, d);
    } else {
        f.unread(d);
    }
    }
}

关于PushbackInputStream的有趣之处在于,您可以查看流中的字节数以查找模式。如果模式不匹配,则使用unread方法将字节包压入其中。