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

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

Barbara Streisand
Barbara Streisand原创
2024-12-14 03:08:17864浏览

How to Read from a Java InputStream with a Timeout?

从具有超时的输入流中读取

特定问题需要量身定制的解决方案。本题旨在构造一个方法,在给定的时间限制内从 InputStream 中检索数据,如果超过则优雅地失败并显示错误代码。

Java InputStream 的具体注意事项

解决此问题需要理解Java的InputStream类:

  • 它的read()方法不能通用
  • 将 InputStream 包装到 Reader 或 InterruptibleChannel 类中不会扩展可用选项。
  • available() 可能随时返回 0。
  • close() 可能会阻塞或什么也不做。
  • 无条件终止另一个线程不是

使用 available() 检查输入可用性

与问题陈述中的说法相反,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 &amp;&amp; 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中文网其他相关文章!

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