java - java教科书帮助中的推回流示例。到底是怎么回事?

标签 java

我正在我的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/

相关文章:

java - 如何将 JLabel 放入 JLabel 中或将 JLabel 分成正方形

java - 在 hibernate 中,实体名称属性的作用是什么?

java - 没有 AlgorithmParameterSpec 可以使用 KeyAgreement 吗?

java - Spring-data-jpa + Hibernate 没有创建预期的表

java - Bouncy CaSTLe 在尝试解密 AES 消息时抛出 "mac check in OCB failed"

java - 使用可选的空检查

java - 在 Android Studio 中访问 aar 文件的类时出现 classNotFoundException

java - j2me网络

java - 无法加载类 'org.gradle.internal.impldep.com.google.common.collect.Lists'

java - 同步和可变变量