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响应时间。