试图找到在非阻塞模式下从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");
}
如何不阻塞地读取所有字节?
答案 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()
方法在读取之前测试多少字节可用。