我正在我的java书中阅读这个例子:
// Demonstrate unread().
import java.io.*;
class PushbackInputStreamDemo {
public static void main(String args[]) {
String s = "if (a == 4) a = 0;\n";
byte buf[] = s.getBytes();
ByteArrayInputStream in = new ByteArrayInputStream(buf);
int c;
try ( PushbackInputStream f = new PushbackInputStream(in) )
{
while ((c = f.read()) != -1) {
switch(c) {
case '=':
if ((c = f.read()) == '=')
System.out.print(".eq.");
else {
System.out.print("<-");
f.unread(c);
}
break;
default:
System.out.print((char) c);
break;
}
}
} catch(IOException e) {
System.out.println("I/O Error: " + e);
}
}
}
Here is the output for this example. Notice that == was replaced by ".eq." and = was replaced by "<-".
if (a .eq. 4) a <- 0;
当到达单曲=
时标志,它读取它,打印出 <-
然后取消读取 =
并将其放回 pushbackInputStream
正确的?所以当它调用c = f.read()
时,它收到 =
又对吗?那么为什么我们不处于 <-
的无限循环中呢?符号?
最佳答案
while 循环包含两个可能的分支:一个当 =
时性格是遇到的,一劳永逸。对于其他场景,角色只是转储到控制台,因此不会创建无限循环。
对于我们遇到 =
的分支字符,然后它将从流中读取下一个字符(之后 =
字符)。如果下一个字符是第二个 =
然后字符.eq.
被转储到控制台,并且没有任何内容被推回 PushbackInputStream
所以==
序列已被完全消耗,当我们绕过while
时再次循环它会找到 ==
之后的内容。所以这种情况不会导致无限循环。
如果第一个字符之后的下一个字符 =
是不是第二个=
然后字符<-
被转储到控制台,然后该第二字符被推回到流中。执行while
然后循环重新读取这个字符(因为我们已经知道它不是 =
字符)它将在 <-
之后立即转储到控制台。 。所以这种情况不会导致无限循环。
关于java - java教科书帮助中的推回流示例。到底是怎么回事?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57341113/