从具有超时的InputStream读取
是否可以从InputStream读取并指定超时?是的,但它并不像看起来那么简单。 InputStream.read() 方法可能是不可中断的,并且即使数据可用,InputStream.available() 方法也可能返回 0。
Sun 文档支持的事实
使用 InputStream.available()
InputStream.available() 应该返回可在不阻塞的情况下读取的字节数的估计值,但是需要注意的是,子类负责重写此方法。在实践中,具体的输入流类确实为 available() 提供了有意义的值。
注意事项
最简单的解决方案(无阻塞)
byte[] inputData = new byte[1024]; int result = is.read(inputData, 0, is.available());
更丰富的解决方案(在超时内最大化缓冲区填充)
public static int readInputStreamWithTimeout(InputStream is, byte[] b, int timeoutMillis) throws IOException { int bufferOffset = 0; long maxTimeMillis = System.currentTimeMillis() + timeoutMillis; while (System.currentTimeMillis() < maxTimeMillis & bufferOffset < b.length) { int readLength = java.lang.Math.min(is.available(), b.length - bufferOffset); int readResult = is.read(b, bufferOffset, readLength); if (readResult == -1) break; bufferOffset += readResult; } return bufferOffset; }
以上是如何从具有超时的 Java 输入流中读取数据?的详细内容。更多信息请关注PHP中文网其他相关文章!