一个简单的Java程序输出与IO没有预期的那样

时间:2016-11-24 07:27:28

标签: java

我的代码没有按预期工作,它必须使用System.in.read()方法做一些事情。该程序旨在从控制台读取,直到我按下' c'或者' C'

import java.io.*;

public class Input{
    public static void main(String args[])throws IOException{
        char b;

        outer:
        do{
            b= (char)System.in.read();
            System.out.println(b);
            if(b=='c'||b=='C'){
               break outer;
            }
        } while(true);      
    }
}

输出

D:\ex\1>java Input
d
d



c
c

D:\ex\1>

为什么输出中有空行

2 个答案:

答案 0 :(得分:2)

当您第一次致电read时,它会显示'd'并使用新行打印(因为您使用println代替print)。这解释了第一条新线。在循环的第一次迭代之后,再次调用read。这次,它读取回车符'\r'。第三次调用read时,它会读取换行符'\n'。这就是为什么有3条新线。

  

这些新行字符来自哪里?

每次输入字符时,按"输入"对?这就是新行!由于您使用的是Windows,因此会插入\r\n。在我的Mac上,新行只是\n。这就是为什么你的代码在我的Mac上运行时产生2行而不是3行的原因。

解决这个问题的方法不是阅读新行:

do{
     b= (char)System.in.read();
     if (b == '\r' || b == '\n') continue;
     System.out.println(b);
        if(b=='c'||b=='C'){break outer;}

}while(true);

或者您可以使用Scanner

char b;
Scanner sc = new Scanner(System.in);
outer:
do{
    b= sc.findWithinHorizon(".", 0).charAt(0);
    System.out.println(b);
    if(b=='c'||b=='C'){break outer;}

}while(true);

答案 1 :(得分:0)

只需将System.out.println(b);替换为

即可
int a = (int) b;
if (a != 13 && a != 10) {
    System.out.println(b);
}

如果它的int值是换行和回车

,它将不会打印char