在非阻塞模式下从InputStream读取所有字节

时间:2019-06-07 07:12:25

标签: java inputstream

试图找到在非阻塞模式下从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 :(得分:0)

我认为您想超时阅读。

对于URLConnection(InputStream应该源于此),您可以设置其他超时,并检查最佳的块大小(来自发送者)。

对于套接字,存在相同的功能。

超时可以使用线程this I found on 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();
}

答案 1 :(得分:-1)

您可以使用InputStream.available()方法在读取之前测试多少字节可用。