InputStreamReader奇怪的输出

时间:2017-07-12 20:55:28

标签: java

所以我刚开始学习Java FileI / O并且正在使用Input Stream Reader。但是,我所做的练习输出非常奇怪,也与我所遵循的指南不符。

public static void main(String[] args)
    throws InterruptedException
{
    InputStreamReader cin = null;
    try {
        cin = new InputStreamReader(System.in);
        char s = 0;
        while (s != 133) {
            s = (char) cin.read();
            System.out.println(s);
        }
    } catch (IOException e) {
        System.out.println("File IO Error");
    } finally {
        try {
            cin.close();
        } catch (IOException e) {
            e.printStackTrace();
        }
    }
}

代码应该只打印字符,但它也打印出一堆换行符。

a
a
<linebreak>
<linebreak>
<linebreak>

当我将char转换为int时,它输出字符id,然后输出13和10.

a
97
13
10

有谁知道问题是什么+如何解决这个问题?

4 个答案:

答案 0 :(得分:2)

operator()将读取单个字符,当您按Enter键时,它也会读取回车符(新换行符)并输出它的表示。

替换

read()

System.out.println(s);

一般来说System.out.print(s); 是低级别的,建议使用InputStreamReader之类的包装器,如下所示(它也将解决您的问题)

BufferedReader

另一个建议是使用BufferedReader br = new BufferedReader(new InputStreamReader(System.in)); String tLine = null; // now reading line of characters (delimited by carriage return) while ((tLine = br.readLine()) != null) { System.out.println(tLine); } ,而不是传统的try-catch块。

try-with-resources

答案 1 :(得分:0)

您的计划要求输入。要提供该输入,请按a然后按<enter>

<enter>键成为输入流中的字符CR(十进制13)和LF(十进制10)。

结果是你的程序读了3个字符。

答案 2 :(得分:0)

解决此问题的一种方法是添加:

if(System.getProperty("os.name").startsWith("Windows")){cin.skip(2);} // for Windows
else{cin.skip(1);} // for unix-like OS

System.out.println(s);行之后,在这种情况下,您的程序会跳过来自Line Feed的两个字符Carriage ReturnEnterenter image description here

答案 3 :(得分:0)

System.out.println()不仅打印出你的字符串,而且还会前进到一个新行。在Java中,这是通过使用回车符和换行符来完成的。回车符的ASCII值为13,换行符的ASCII值为10,这就是为什么你看到13和10也返回的原因。

我不是Java的专家,但我认为你获得三个换行符的原因是因为当你在输入流阅读器中输入一个字符时,你不仅要输入字符,还要按Enter键输入字符。因此,如果输入字符'a'并按Enter键,则程序将输出字符a,然后打印换行符,因为它是System.out.println()。然后它将输出Enter字符,导致另一个换行符,然后打印第三个换行符(因为它是一个System.out.println)。