gpt4 book ai didi

java - 对 Java 中 System.in 的 read() 方法的行为感到困惑

转载 作者:塔克拉玛干 更新时间:2023-11-03 05:16:28 24 4
gpt4 key购买 nike

我知道System类的System.in是InputStream具体子类的一个实例,因为InputStream的read()方法是抽象的,System.in必须重写这个方法。根据关于 InputStream 的 read() 方法的文档:

public abstract int read() throws IOException

Reads the next byte of data from the input stream. The value byte is returned as an int in the range 0 to 255. If no byte is available because the end of the stream has been reached, the value -1 is returned. This method blocks until input data is available, the end of the stream is detected, or an exception is thrown.
A subclass must provide an implementation of this method.

Returns:
the next byte of data, or -1 if the end of the stream is reached.

Throws:
IOException - if an I/O error occurs.

如果到达流的末尾,read() 方法应返回 -1。我的问题是,System.in.read() 何时会返回 -1?

示例代码如下:

import java.io.*;

class SystemInTest{
public static void main(String[] args) throws IOException{
InputStream in = System.in;
//InputStream in = new FileInputStream("h.txt");

int ch = 0;
while((ch = in.read()) != -1){
System.out.println(ch);
}
}
}

运行这段代码,然后输入“abc”,然后按“Enter”,结果是(在 Linux 下):

97
98
99
10

然后应用程序被阻塞并等待另一个输入。但我认为 while 循环“ch = in.read()”中的语句应该继续运行并在读取行终止字符并在控制台上打印 10 后返回 -1。如果是这样,则应终止该应用程序。但是它被阻止了。

作为比较,如果我取消对注释行的注释,使用内容为“abc\n”的文件作为字节输入流,那么应用程序会按预期终止,因为返回了 -1。

System.in.read() 真的不会返回 -1 吗?如果是这样,为什么 System.in 中的 read() 方法的实现与 InputStream 的其他子类(例如 FileInputStream)不同?

最佳答案

Enter 只意味着你完成了一行,并不意味着你完成了整个"file"。

完成文件的方式取决于操作系统。在 Linux 上,它是 Ctrl+D,您可以在许多程序中使用它来退出它们(而不是键入 exitquit)。在 Windows 上,它是 Ctrl+Z

关于java - 对 Java 中 System.in 的 read() 方法的行为感到困惑,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37741304/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com