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