Читать все байты из InputStream в неблокирующем режиме - PullRequest
0 голосов
/ 07 июня 2019

Попытка найти решение для чтения всех байтов из InputStream в неблокирующем режиме.Секция inputStream.read() в функции ниже блокирует навсегда, когда нет доступных данных.

private static String extract(InputStream inputStream) throws IOException { 
    ByteArrayOutputStream baos = new ByteArrayOutputStream();               
    byte[] buffer = new byte[1024];
    int read = 0;
    while ((read = inputStream.read(buffer, 0, buffer.length)) != -1) {
        baos.write(buffer, 0, read);
    }       
    baos.flush();       
    return  new String(baos.toByteArray(), "UTF-8");
}

Как прочитать все байты без блокировки?

Ответы [ 2 ]

0 голосов
/ 07 июня 2019

Полагаю, вам нужен тайм-аут для чтения.

Для URLConnection (если из этого вытекает InputStream) вы можете установить разные таймауты и проверить оптимальный размер блока (от отправителя).

Для сокетов такая же функциональность существует.

Тайм-аут, который можно сделать самостоятельно, используя поток: это я обнаружил на SO .

Но также Future кажетсясоответствующий:

ExecutorService service = Executors.newFixedThreadPool(2); // Or whatever.
// Callable<String> callable = () -> extract(inputStream);
Future<String> future = service.submit(() -> extract(inputStream));
try {
    String s = future.get(3, TimeUnit.SECONDS);
} catch (Exception e){
    e.printStackTrace();
    future.cancel(true);
    inputStream.close();
}
0 голосов
/ 07 июня 2019

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

...