Чтение п байт атомарной без блокировки

голоса
0

Я просто задал вопрос о том, почему мой поток закрыли не работал. Это закончилось тем , что из - за readLine()блокирования моей нити , прежде чем флаг отключения может быть распознан. Это было легко исправить, проверив ready()перед вызовом readLine().

Тем не менее, я теперь с помощью DataInputStreamсделать следующее в серии:

int x = reader.readInt();
int y = reader.readInt();
byte[] z = new byte[y]
reader.readFully(z);

Я знаю , что я мог бы реализовать свою собственную буферизацию , которая будет проверять флаг работает файл при загрузке до буфера. Но я знаю , что это было бы утомительно. Вместо этого, я мог позволить данным буферизуются в InputStreamклассе, и ждать , пока у меня есть мои nсчитанные байты, перед выполнением неблокируемому чтения - как я знаю , сколько мне нужно читать.

  • 4 байт для первого целого числа
  • 4 байтов для второго целого числа y
  • и yбайты для zмассива байтов.

Вместо того , чтобы использовать , ready()чтобы проверить, есть ли строка в буфере, есть какой - то эквивалент ready(int bytesNeeded)?

Задан 14/02/2020 в 00:00
источник пользователем
На других языках...                            


3 ответов

голоса
0

available()Метод возвращает количество байт в InputStreamы внутреннего буфера.

Таким образом, можно сделать что-то вроде:

while (reader.available() < 4) checkIfShutdown();
reader.readInt();
Ответил 14/02/2020 в 00:19
источник пользователем

голоса
0

Вы можете использовать , InputStream.available()чтобы получить оценку количества байтов , которые могут быть считаны. Цитирование в Javadoc :

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

Другими словами, если available()возвращается n, вы знаете , вы можете смело звонить read(n)без блокировки. Обратите внимание , что, как Javadoc состояния, возвращенное значение является приблизительным. Например, InflaterInputStream.available () всегда возвращает 1 , если EOF не достигнут. Проверьте документацию InputStreamподкласса вы будете использовать , чтобы убедиться , что он соответствует вашим потребностям.

Ответил 14/02/2020 в 00:20
источник пользователем

голоса
0

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

Ответил 14/02/2020 в 00:51
источник пользователем

Cookies help us deliver our services. By using our services, you agree to our use of cookies. Learn more