Java InputStreamReader奇怪的输出

Java InputStreamReader奇怪的输出,java,Java,所以我刚开始学习Java文件I/O,并开始使用输入流阅读器。然而,我做的一个练习的输出非常奇怪,并且与我遵循的指南不匹配 public static void main(String[] args) throws InterruptedException { InputStreamReader cin = null; try { cin = new InputStreamReader(System.in); char s = 0;

所以我刚开始学习Java文件I/O,并开始使用输入流阅读器。然而,我做的一个练习的输出非常奇怪,并且与我遵循的指南不匹配

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>
有人知道问题是什么吗?如何解决这个问题?

read()
将读取单个字符,当您按enter键时,它也会读取回车符(换行符)并输出其表示形式

替换

System.out.println(s);

一般来说,
InputStreamReader
是低级别的,建议按如下方式使用诸如
BufferedReader
之类的包装器(它也会解决您的问题)

另一个建议是使用
try with resources
,而不是传统的try-catch块

try (BufferedReader br = new BufferedReader(new FileReader(path))) {
        // your code
}
// Resource will be closed automatically at this line
read()
将读取单个字符,当您按enter键时,它也会读取回车符(新行进给)并输出其表示形式

替换

System.out.println(s);

一般来说,
InputStreamReader
是低级别的,建议按如下方式使用诸如
BufferedReader
之类的包装器(它也会解决您的问题)

另一个建议是使用
try with resources
,而不是传统的try-catch块

try (BufferedReader br = new BufferedReader(new FileReader(path))) {
        // your code
}
// Resource will be closed automatically at this line

您的程序正在请求输入。要提供该输入,请按
a
,然后点击

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


结果是您的程序读取3个字符。

您的程序请求输入。要提供该输入,请按
a
,然后点击

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


结果是程序读取3个字符。

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

if(System.getProperty("os.name").startsWith("Windows")){cin.skip(2);} // for Windows
else{cin.skip(1);} // for unix-like OS
System.out.println之后行,在这种情况下,程序跳过两个字符
换行
回车

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

if(System.getProperty("os.name").startsWith("Windows")){cin.skip(2);} // for Windows
else{cin.skip(1);} // for unix-like OS
System.out.println之后行,在这种情况下,程序跳过两个字符
换行
回车

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

我不是Java方面的专家,但我认为之所以会出现三个换行符,是因为当您在输入流读取器中输入字符时,您不仅要输入字符,还要按enter键输入字符。因此,如果输入字符“a”并按enter键,则程序将输出字符a,然后打印换行符,因为它是System.out.println()。然后,它将输出Enter字符,导致另一个换行符,然后打印第三个换行符(因为它是System.out.println)。

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


我不是Java方面的专家,但我认为之所以会出现三个换行符,是因为当您在输入流读取器中输入字符时,您不仅要输入字符,还要按enter键输入字符。因此,如果输入字符“a”并按enter键,则程序将输出字符a,然后打印换行符,因为它是System.out.println()。然后它将输出Enter字符,导致另一个换行符,然后打印第三个换行符(因为它是System.out.println)。

欢迎使用堆栈溢出!请阅读我们的,以帮助您提出一个好问题,从而得到一个好答案。13,10代表LF(换行)和CR(回车),您的输入中有LF,CR。您也应该使用。这将使您的代码不那么复杂,也不那么容易出错。欢迎使用堆栈溢出!请阅读我们的,以帮助您提出一个好问题,从而得到一个好答案。13,10代表LF(换行)和CR(回车),您的输入中有LF,CR。您也应该使用。这将使您的代码不那么复杂,也不那么容易出错。这不是问题。问题是关于在两行后面加上
a
的额外空白行。引用:“代码应该只打印字符”,我看不出他在哪里提到了新行。OP在最后询问了额外的
,这是输入流中
CR
LF
字符的结果。他也在问如何修复它,我的解决方案不会这样做?使用
System.out.print(s)
是一个简单的好主意,还有一个!OP希望在单独的行上打印每个字符。这不是问题。问题是关于在两行后面加上
a
的额外空白行。引用:“代码应该只打印字符”,我看不出他在哪里提到了新行。OP在最后询问了额外的
,这是输入流中
CR
LF
字符的结果。他也在问如何修复它,我的解决方案不会这样做?使用
System.out.print(s)
是一个简单的好主意,还有一个!盲目地假设用户在按enter键之前只输入一个字符。它还假设Windows,因为我不相信输入strea