【问题标题】:Java : Error when reading input with BufferedReaderJava:使用 BufferedReader 读取输入时出错
【发布时间】:2016-11-23 02:44:00
【问题描述】:

我正在使用 Java 来解释一些输入。我正在使用 BufferedReader。我的目标是在读取一个字符后读取一定数量的行,其中 -1 是停止命令。像这样的

2
CASE 1 - L1
CASE 1 - L2
3
CASE 2 - L1
CASE 2 - L2
CASE 2 - L3
-1

我的目标只是作为输出:

CASE 1 - L1
CASE 1 - L2
CASE 2 - L1
CASE 2 - L2
CASE 2 - L3

这意味着我以正确的方式获得了线路。我的代码如下:

public class TESTE {

    public static void main(String[] args) throws IOException {
        BufferedReader buffer = new BufferedReader(new InputStreamReader(System.in));
        int state;

        while ((state = buffer.read()) != 45) {
            char c = (char) state;
            if (Character.isDigit(c)) {
                int n = Character.getNumericValue(c);
                for (int i = 0; i < n; ++i) {
                    System.out.println("L:" + buffer.readLine());
                    System.out.println();
                }
            }
        }

    }

}

由于某种原因,我的输出是:

L:
L:CASE 1 - L1
L: - L2
L:
L:CASE 2 - L1
L:CASE 2 - L2
L: - L3

我做错了什么?是否有一种优雅的方式来处理该输入?

【问题讨论】:

    标签: java input bufferedreader


    【解决方案1】:

    这就是发生的事情。

    1. buffer.read() 返回50'2'
    2. 将其转换为n,即2
    3. 读两行

    现在缓冲区中的下一步是什么? \n 就在 '2' 之后!这就是你得到第一个输出的原因

    L:
    

    空行。

    好吧,没有必要继续了。整个过程都断了。

    一种方法:

        Scanner in = new Scanner(System.in);
        while (true) {
            int n = Integer.parseInt(in.nextLine());
            if (n == -1) break;
            for (int i = 0; i < n; i++) {
                System.out.println("L:" + in.nextLine());
            }
        }
    

    【讨论】:

    • 我完全被困住了!然后我发现\n !!我只是添加 buffer.readLine();在 int n = Character.getNumericValue(c); 之前效果很好!您的解决方案也给了我相同的预期输出!但是比我的短,而且更优雅,我会用那个!谢谢!!!
    • @Pj- 如果用户提供非数字输入,则此代码将引发我的回答中处理的异常。较短的代码并不意味着它们很优雅!
    • @WasiAhmad 谢谢!!这是一个很好的观点!我会更加小心的!再次感谢您!
    【解决方案2】:

    在您的for 循环中,您有buffer.readline()。因此,您基本上一口气读完了所有行(而我认为您希望逐行阅读)。

    您可能想利用readLine() 的功能来简化您的代码,例如。当到达输出结束时,它返回null。这将允许您消除有点笨拙的 -1 指示输入结束。

    String line;
    while ((line = buffer.readLine()) != null) {
        if (!Character.isDigit(line.charAt(0)) {
            System.out.println("L:" + line);
        }
    }
    

    【讨论】:

    • 如果是这种情况,那么在读取第一个 int 之后,将读取输入的其余部分,并且标签“L:”只会出现一次,对吗? “3”也应该在输出中,不是这样的。
    • 是和不是。是的,您在第一个 int 之后读取了整个输入。不,"L:" 每次都会出现,因为它也在 for 循环内。
    • 我得到了“预期的”添加 buffer.readLine();在 int n = Character.getNumericValue(c); 之前似乎在阅读完 char 之后,我仍然有整行要读取,这是空的,所以通过这样做,我正在清除该行,其余的按照我所说的进行。
    • 此外,它也在打印 L:-1,而它应该已经终止
    【解决方案3】:

    一个全面的答案可以如下,这将有助于您的目的。请注意,与其考虑单个数字,不如考虑整数,因为该值可以大于 9。在这种情况下,考虑单个字符是不够的!

    public static void main(String[] args) throws IOException {
        BufferedReader buffer = new BufferedReader(new InputStreamReader(System.in));
        String line;
    
        while ((line = buffer.readLine()) != null) {
            int value;
            try {
                value = Integer.parseInt(line); // if user gives non-integer values as input
            } catch (NumberFormatException ex) {
                System.out.println("Error!");
                continue; // print error message and then continue 
            }
            if (value == -1) {
                break;
            }
            for (int i = 0; i < value; i++) {
                line = buffer.readLine(); // keep asking for input from user
                System.out.println("L:" + line);
            }
        }
    
    }
    

    【讨论】:

    • 这确实正是我想要的,我的原始代码稍作修改也可以:只需添加 buffer.readLine();在 int n = Character.getNumericValue(c); 之前它给了我和你一样的输出!非常感谢!
    猜你喜欢
    • 1970-01-01
    • 2013-10-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-03-17
    相关资源
    最近更新 更多