Java 以非阻塞模式从InputStream读取所有字节

Java 以非阻塞模式从InputStream读取所有字节,java,inputstream,Java,Inputstream,试图找到以非阻塞模式从InputStream读取所有字节的解决方案。当没有可用数据时,下面函数中的inputStream.read()部分将永远阻塞 private static String extract(InputStream inputStream) throws IOException { ByteArrayOutputStream baos = new ByteArrayOutputStream(); byte[] buffer = n

试图找到以非阻塞模式从
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");
}

如何在不阻塞的情况下读取所有字节?

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

我假设您需要读取超时

对于URLConnection(如果InputStream源于此),您可以设置其他超时,并检查最佳块大小(来自发送方)

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

使用线程可以使自己超时:

但是
未来
似乎也很合适:

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();
}
ExecutorService service=Executors.newFixedThreadPool(2);//或者别的什么。
//Callable Callable=()->extract(inputStream);
Future=service.submit(()->extract(inputStream));
试一试{
字符串s=future.get(3,TimeUnit.SECONDS);
}捕获(例外e){
e、 printStackTrace();
future.cancel(true);
inputStream.close();
}

您尝试过IOUtils.toString(inputstream)?它;在非阻塞模式下,无法读取
InputStream
。您必须使用面向缓冲区的IO,而不是面向流的IO。查看NIO包如果没有阻塞的风险,您无法读取任何字节。你的问题在措辞上存在矛盾<代码>输入流被阻塞,句点。但如果你想“读取所有字节”,为什么你认为你需要非阻塞模式?他想读取所有字节,那么为什么他需要一个超时?或者确实是非阻塞模式?@user207421“在没有可用数据时会永久阻塞”-看起来他想阻止这种情况。我建议的解决方案是:合理的操作超时。是的,那么你根本就没有数据。顺便说一句,由于这是一个未来,您可以尽早提交任务,在get的时刻甚至可能有一个0响应时间。