InputStream.available () javadoc:
Возвращает количество байтов, которые могут быть прочитаны (или пропущены) из этого входного потока без блокировки
Я думаю, что блокировка означает, что поток, из которого я позвонил read()
, блокируется (поток управления не идет дальше) до тех пор, пока не вернется read()
.В этом смысле я не вижу ни одного сценария, в котором read () может быть вызван без блокировки.
Другое значение блокировки может заключаться в том, что если я хочу прочитать 3 байта и не иметь ни одного, или простоЕсли доступен 1 байт, read()
заблокирует и будет ждать появления большего количества байтов, но я не могу понять, что b / c, тогда вызов read()
и попытка прочитать больше, чем доступно, могут вызвать вечную блокировку (просто чтение изображения 100байт из файла размером 10 байт).
В каком смысле java.io блокирует (1) или (2)?
Я не могу смоделировать ситуацию при чтенииметоды блока ввода-вывода (в смысле (2)) с FileInputStream или ByteArrayInputStream:
// file content is: 1 2 3
FileInputStream myStream = new FileInputStream("d:\\file.txt");
byte[] b = new byte[100];
myStream.read(b);
System.out.println("control reached here?");
System.out.println(Arrays.toString(b));
Вывод:
reached here?
[122, 100, 122, 120, 118, 122, 120, 32, 118, 122, 120, 118, 32, 122, 120, 118, 32, 122, 118, 99, 122, 32, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0]
Второй вызов myStream.read(b)
просто вернет -1 также без блокировки.
В каком сценарии происходит блокировка?
Я думал, что это происходит, если я пытаюсь прочитать 5 байтов, а есть три.Если его нет, это означает, что EOF / end-of-stream и -1 возвращается (без блокировки).
PS Я склонен думать, что java.io - это и (1), и (2).): это синхронно (1) и блокировка (2), но эта блокировка действительно наблюдается только при работе с сокетами (Socket.getInputStream() / Socket.getOutputStream()
).