Java Scanner 用于在不前进位置的情况下窥视某些东西(int、double、line 等)

标签 java java.util.scanner bufferedreader inputstreamreader

我们知道nextInt() , nextDouble() , nextLine()等 Java 方法 Scanner类解析某些内容(int、double、line 等)并推进扫描仪的位置。但是我只需要一种方法来解析某些东西而不是推进位置。这意味着,我需要某种方式来处理 peekInt() 之类的事情。 , peekDouble() , peekLine()等方法。

下面是一个示例,说明为什么它可能是必要的。假设,我有一个抽象类 Server它有一个抽象方法 respond(Scanner in, PrintWriter out, String clientIp)由其他类实现。这是代码的一部分:

public abstract class Server {
    // ... (some initialization variables)

    public static final String endSocketMarker = "END";

    public final void runServer() {
        // ... (multithreading code)

        clientSocket = serverSocket.accept();
        Scanner in = new Scanner(new BufferedReader(new InputStreamReader(clientSocket.getInputStream())));
        PrintWriter out = new PrintWriter(clientSocket.getOutputStream(), true);

        String clientIp = in.nextLine();
        String marker = "";
        do {
            respond(in, out, clientIp); // call abstract method
            marker = in.nextLine(); //TODO: find a way so that input line is peeked (but not skipped)
        } while(!marker.equals(endSocketMarker));

        // ... (close client socket)
    }

    protected abstract void respond(Scanner in, PrintWriter out, String clientIp);

    // ... (other methods)
}

这里marker = in.nextLine();解析该行直到找到一个行分隔符,然后将位置前进到下一行的开头。如 marker.equals(endSocketMarker)为假,则在 marker 中分配的字符串内部无法读取respond(in, out, clientIp)方法。必须以某种方式避免它。我可以传递变量 marker进入 respond(in, out, clientIp) ,但会使代码变得困惑。

有没有更好的方法来实现我的目标?

最佳答案

java.util.Scanner.hasNext()方法 如果此扫描器的输入中有另一个标记,则返回 true。此方法可能会在等待输入扫描时阻塞。扫描仪不会通过任何输入。

这里有一个例子,
hasNext() example

关于Java Scanner 用于在不前进位置的情况下窥视某些东西(int、double、line 等),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44542156/

相关文章:

java - Java Callable Statement 获取 CURSOR 时出现异常如何解决?

java - 在 Java 中,对于单行上的多个整数使用 BufferedReader 而不是 Scanner Class 是最佳选择吗?

java - Mac 上没有此类文件或目录错误

java - 这个条件有什么作用(BufferedReader 和 InputStreamReader)?

java - 输出文件不包含我从源复制的所有行

java - BufferedReader 创建奇数字符,我应该使用哪种字符编码?

java - 如何使用 print 语句对代码进行单元测试?

java - 移除绳子 - 在线购物车

java 表达式非法开始错误

java - 邮件 header 消息的正则表达式