我们知道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/