System.in.read() - 为什么回车后有两个空行?

时间:2017-02-24 10:29:33

标签: java inputstream

我搜索了很多,但我找不到准确的答案。

为什么我的程序在读完回车后会发出一条额外的行(所以两条空行)?

当我在carriageReturn(13)之前完成while循环时,它会在“c”之后直接输出“------”。

这是我的程序:

import java.io.*;
class IOIntro {
public static void main(String args[]) throws IOException {
     int letter = 0;
    System.out.print("Type a letter and press Enter: ");

   while((letter = System.in.read ()) !=10) { //loops throw whole inputStream until there is a new Line Feed
       System.out.println("You typed: " + letter);
       System.out.println((char) letter);
    }
   System.out.print("--------");
   }
 }

13(回车)之后,10(换行)之前的输出:

Type a letter and press Enter: ads
You typed: 97
a
You typed: 100
d
You typed: 115
s
You typed: 13


--------

13之前的输出(回车):

Type a letter and press Enter: ads
You typed: 97
a
You typed: 100
d
You typed: 115
s
--------

感谢您的帮助。

3 个答案:

答案 0 :(得分:0)

观察这一行:

System.out.println((char) letter);

您正在使用ASCII代码13打印该字母,代表"回车"。另外,您正在使用println,在输入结束时打印一条额外的新行。因此,两个空行将打印到控制台。

  

更新

Enter密钥a.k.a. Return密钥将\r或字符代码13发送到控制台。因此,在while循环条件下,进行此更改:

while((letter = System.in.read ()) != '\r') { 

希望这有帮助!

答案 1 :(得分:0)

当您按Enter键时,在Windows上会返回两个字符:回车符(13)和换行符(10)。

代码13有些令人困惑,因为在某些平台(例如OSX)上它意味着新行

您的IDE可能正在尝试安全地将其解释为换行符。如果您正在使用Eclipse,请参阅bug 76936

\r(13)应将光标移动到行的开头,但保持在该行

如果您在真正的控制台中运行应用程序,则只能看到一个换行符。

>java -cp . IOIntro
Type a letter and press Enter:
You typed: 13

--------
>

如果您想在Enter上以静默方式退出,请将测试从10更改为13

   while((letter = System.in.read ()) !=13) {
       System.out.println("You typed: " + letter);
       System.out.println((char) letter);
    }

答案 2 :(得分:0)

13是回车符,println()写一个换行符。

所以:

 System.out.println("You typed: " + letter);
 System.out.println((char) letter);

对于' a',打印:

 Your typed: 100{newline}a{newline}

对于' {newline}',打印:

 You typed: 13{newline}{cr}{newline}

......这就是你所看到的。