我需要从PushbackInputStream
读取一个数字(可以是整数,双数,正数,负数等)。我是否必须逐字节读取并测试它们是否在0-9
和测试分隔空间之间?
或者如何使用空格作为分隔将流中的其余部分读入String数组?
修改
让我让自己更清楚一些。我想做一些涉及运算符和数字的表达式解析。我可能(如果不是,你的好方法是什么?)每当我遇到一个数字的一部分而不是操作符时需要使用PushbackInputStream
,因为在这种情况下我会读取/推回该部分的数字我只是误读了。例如,我想解析“10 + 20 * 30”,我读1
,这不在我的运算符的enum
中,我把它放回去,尝试读取{的{ {1}}。那么怎么做呢?
答案 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
方法将字节包压入其中。