Java:使用BufferedReader读取输入时出错

时间:2016-11-23 02:44:01

标签: java input bufferedreader

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

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

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

3 个答案:

答案 0 :(得分:0)

for循环中,您有buffer.readline()。因此,您基本上可以一次性读取所有行(而我认为您希望逐行读取)。

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

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

答案 1 :(得分:0)

全面的答案可以如下,这将符合您的目的。请注意,如果考虑整数,而不是考虑单个数字,那么它会更好,因为该值可能大于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);
        }
    }

}

答案 2 :(得分:0)

发生了什么事。

  1. buffer.read()返回50
  2. '2'
  3. 将其转换为n,即2
  4. 阅读两行
  5. 现在缓冲区中的下一步是什么? \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());
            }
        }