我知道System类的System.in是InputStream的具体子类的实例,因为InputStream的read()方法是抽象的,System.in必须覆盖此方法。 根据有关InputStream的read()方法的文档:
public abstract int read()抛出IOException
从输入流中读取下一个数据字节。值字节作为int返回,范围为0到255.如果没有字节可用,因为已到达流的末尾,则返回值-1。此方法将阻塞,直到输入数据可用,检测到流的末尾或抛出异常 子类必须提供此方法的实现。
返回:
数据的下一个字节,如果到达流的末尾,则返回-1。抛出:
IOException - 如果发生I / O错误。
如果到达流的末尾,则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)不同?
答案 0 :(得分:4)
按Enter
仅表示您完成了一行,但这并不意味着您已完成整个“文件”。
如何完成文件取决于操作系统。在Linux上,它是Ctrl+D
,您可以在许多程序中使用它来退出它们(而不是键入exit
或quit
)。在Windows上,它是Ctrl+Z
。
答案 1 :(得分:1)
输入流没有固定大小,因此您的程序进入无限循环并一次又一次地请求输入。 但是,h.txt文件具有固定大小,因此在终止时。