关于Java中System.in的read()方法行为的混淆

时间:2016-06-10 06:28:32

标签: java io system.in

我知道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)不同?

2 个答案:

答案 0 :(得分:4)

Enter仅表示您完成了一行,但这并不意味着您已完成整个“文件”。

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

答案 1 :(得分:1)

输入流没有固定大小,因此您的程序进入无限循环并一次又一次地请求输入。 但是,h.txt文件具有固定大小,因此在终止时。