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

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

Barbara Streisand
发布: 2024-12-14 03:08:17
原创
859 人浏览过

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

来源:php.cn
本站声明
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn
作者最新文章
热门教程
更多>
最新下载
更多>
网站特效
网站源码
网站素材
前端模板