2014-10-17 3 views
2

Основываясь на этом question, я хотел бы задать следующее. Предполагая, что блокирование ввода/вывода и у меня есть кусок кода, как следующее:доступны и прочитаны: можем ли мы быть неблокируемыми при использовании блокировки Java I/O?

byte[] data = new byte[10]; 
someInputStream.read(data) 

Этот фрагмент кода собирается блокировать в read вызова до тех пор, пока имеет несколько байт для чтения. Мне известно, что read может фактически читать меньше байтов, и количество прочитанных байтов будет возвращено методом read.

Мой вопрос в том, что. Предположим, у меня есть:

byte[] data = new byte[10]; 
if (someInputeStream.available() >= 10) { 
     someInputStream.read(data); // *** 
} 

Гарантируется ли *** линия не блокировать? Опять же, я знаю, что это чтение все равно может читать менее 10 байт.

ответ

1

Гарантируется, что он не блокируется.

Из Javadoc для InputStream, глядя на available() метода:

Возвращает оценку числа байтов, которые могут быть считаны (или пропущено) от этого входного потока, не блокируя при следующем вызове метод для этого входного потока. Следующим вызовом может быть тот же поток или другой поток. Однократное чтение или пропуск этого байта не будет блокировать, но может читать или пропускать меньше байтов.

(выделено мной.)

Так что не будет блокировать, но (как вы говорите), вы не можете получить полные 10 байт.

Обратите внимание, что это предполагает один поток. Если есть несколько потоков, то, конечно, другой поток мог бы читать из потока между available() и read().

 Смежные вопросы

  • Нет связанных вопросов^_^