特定问题需要量身定制的解决方案。本题旨在构造一个方法,在给定的时间限制内从 InputStream 中检索数据,如果超过则优雅地失败并显示错误代码。
解决此问题需要理解Java的InputStream类:
与问题陈述中的说法相反,InputStream.available() 并不总是返回 0。它提供了一个容易的估计可用数据无阻塞。但是,它可能会低估真实的数据计数。
这种简单的方法不会施加任何阻塞或超时约束:
byte[] inputData = new byte[1024]; int result = is.read(inputData, 0, is.available());
为了进行更精细的控制,方法可以在指定的范围内用可用数据填充缓冲区timeout:
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; }
byte[] inputData = new byte[1024]; int readCount = readInputStreamWithTimeout(System.in, inputData, 6000); // 6 second timeout
这提供了一种从 InputStream 读取阻塞和非阻塞输入源的超时的方法。
以上是如何从具有超时的 Java 输入流中读取数据?的详细内容。更多信息请关注PHP中文网其他相关文章!