У меня есть следующий код для чтения входного потока из соединения сокета:
private ByteBuffer toByteBuffer(BufferedInputStream is) throws IOException {
ByteArrayOutputStream buffer = new ByteArrayOutputStream();
int l;
byte[] data = new byte[256];
while ((l = is.read(data, 0, data.length)) != -1) {
buffer.write(data, 0, l);
}
buffer.flush();
return ByteBuffer.wrap(buffer.toByteArray());
}
В первой итерации цикла while все идет хорошо, и я могу получить данные в буфер. Но тогда он застревает во while ((l = is.read(data, 0, data.length)) != -1) {
Я думаю (и я могу ошибаться), потому что он ждет больше данных из сокета, чего никогда не будет.
Как я могу справиться с этой ситуацией/повесить?
Поскольку метод BufferedInputStream
который вы используете, не блокирует вас, вы получаете такую ситуацию, что, как только ваш InputStream
не будет иметь никаких данных и не будет закрыт, вы не получите -1, а 0. Это отправит ваш метод в бесконечный петля.
Поэтому для чтения локальных потоков лучше проверить read() <= 0
поскольку вы обычно получаете данные достаточно быстро.
Лучший способ - убедиться, что есть eof
, закрывающий поток.