首页 >Java >java教程 >如何从具有超时的 Java 输入流中读取数据?

如何从具有超时的 Java 输入流中读取数据?

Mary-Kate Olsen
Mary-Kate Olsen原创
2024-12-19 22:12:10218浏览

How Can I Read from a Java InputStream with a Timeout?

从具有超时的InputStream读取

是否可以从InputStream读取并指定超时?是的,但它并不像看起来那么简单。 InputStream.read() 方法可能是不可中断的,并且即使数据可用,InputStream.available() 方法也可能返回 0。

Sun 文档支持的事实

  1. InputStream.read() 可以是不可中断。
  2. 使用 Reader 或 InterruptibleChannel 不会有帮助。
  3. InputStream.available() 始终可以返回 0。
  4. InputStream.close() 可以阻塞或什么都不做。
  5. 没有通用的方法可以杀死另一个thread.

使用 InputStream.available()

InputStream.available() 应该返回可在不阻塞的情况下读取的字节数的估计值,但是需要注意的是,子类负责重写此方法。在实践中,具体的输入流类确实为 available() 提供了有意义的值。

注意事项

  1. 确保在 Windows 中键入输入时使用回车符。
  2. InputStream.available() 将返回 0,直到数据可用shell.

最简单的解决方案(无阻塞)

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中文网其他相关文章!

声明:
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn