Путаница в поведении метода 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 имеет фиксированный размер, поэтому время его завершения.