我有通过InputStream消耗Scanner的代码,看起来像

String input = scanner.nextLine().toLowerCase();
if (input.isEmpty()) {
    return defaultAnswer;
} else if (input.startsWith("y")) {
    return true;
} else if (input.startsWith("n")) {
    return false;
}


扫描器由来自InputStream的给定IOUtils.toInputStream("someString")初始化。

我将如何测试if (input.isEmpty())路径?

编辑:

我在代码中交换了两行,空字符串("")导致NoSuchElementException,换行符或回车符导致返回空字符串。

最佳答案

使用IOUtils.toInputStream("")new ByteArrayInputStream(new byte[0])均可。

后者肯定会提供一个空的流,但是它可能会使您的代码失败,因为没有空行要读取-没有行终止符。例如:

import java.io.*;
import java.util.*;

public class Test {

    public static void main(String[] args) {
        InputStream stream = new ByteArrayInputStream(new byte[0]);
        Scanner scanner = new Scanner(stream, "UTF-8");
        String line = scanner.nextLine();
        System.out.println(line);
    }
}


失败与:

Exception in thread "main" java.util.NoSuchElementException: No line found
        at java.util.Scanner.nextLine(Unknown Source)
        at Test.main(Test.java:10)


您可以使用Scanner.hasNextLine()检查对nextLine()的调用是否合适。您可能需要在代码中执行此操作。这实际上取决于您是否要对“输入端无行结束”或“用户输入空行”建模。这些情况截然不同,您应该同时考虑这两种情况。

如果要提供包含换行符的流(即“用户输入了空行”),则可能需要使用IOUtils.toInputStream("\n")。我对未指定Charset的事实感到紧张-您应该仔细考虑期望输入的编码。

09-25 17:50