Путаница в поведении метода read() System.in в Java

Я знаю, что System.in класса System является экземпляром конкретного подкласса InputStream, потому что метод read() InputStream является абстрактным, и System.in должен переопределить этот метод. Согласно документу о методе read() объекта InputStream:

public abstract int read() бросает IOException

Читает следующий байт данных из входного потока. Байт значения возвращается как целое число в диапазоне от 0 до 255. Если байт не доступен, поскольку достигнут конец потока, возвращается значение -1. Этот метод блокируется до тех пор, пока не будут доступны входные данные, не будет обнаружен конец потока или сгенерировано исключение.
Подкласс должен обеспечивать реализацию этого метода.

Возвращает:
следующий байт данных или -1, если достигнут конец потока.

Броски:
IOException - если ошибка ввода-вывода происходит.

Метод 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()" должен продолжать выполняться и возвращать -1 после чтения символа завершения строки и печати 10 на консоли. Если это так, приложение должно быть прекращено. Но это заблокировано.

Для сравнения, если я раскомментирую закомментированную строку, используя файл с содержимым "abc\n" в качестве входного потока байтов, то приложение завершается как ожидание, потому что возвращается -1.

Правда ли, что System.in.read() никогда не возвращает -1? Если да, то почему реализация метода read() в System.in отличается от других подклассов InputStream, таких как FileInputStream?

2 ответа

Решение

Прессование Enter означает только то, что вы закончили строку, это не значит, что вы завершили целый "файл".

Как вы закончите файл зависит от операционной системы. В Linux это Ctrl+D, который вы можете использовать во многих программах для выхода из них (вместо ввода exit или же quit). В Windows это Ctrl+Z,

Входной поток не имеет фиксированного размера, поэтому ваша программа входит в бесконечный цикл и снова и снова запрашивает ввод. Тем не менее, файл h.txt имеет фиксированный размер, поэтому время его завершения.

Другие вопросы по тегам