是否可以从具有超时的输入流中读取?

2023-12-02

具体来说,问题是编写一个这样的方法:

int maybeRead(InputStream in, long timeout)

如果数据在“超时”毫秒内可用,则返回值与 in.read() 相同,否则返回 -2。在该方法返回之前,任何生成的线程都必须退出。

为了避免争论,这里的主题是 java.io.InputStream,如 Sun 所记录(任何 Java 版本)。请注意,这并不像看起来那么简单。以下是 Sun 文档直接支持的一些事实。

  1. in.read() 方法可以是不可中断的。

  2. 将InputStream 包装在Reader 或InterruptibleChannel 中并没有什么帮助,因为所有这些类所能做的就是调用InputStream 的方法。如果可以使用这些类,则可以编写一个直接在 InputStream 上执行相同逻辑的解决方案。

  3. in.available() 返回 0 总是可以接受的。

  4. in.close() 方法可能会阻塞或不执行任何操作。

  5. 没有通用的方法来杀死另一个线程。


使用 inputStream.available()

System.in.available() 返回 0 总是可以接受的。

我发现了相反的情况 - 它总是返回可用字节数的最佳值。 Javadoc 为InputStream.available():

Returns an estimate of the number of bytes that can be read (or skipped over) 
from this input stream without blocking by the next invocation of a method for 
this input stream.

由于时间/陈旧性,估计是不可避免的。由于新数据不断到来,这一数字可能会被一次性低估。然而,它总是“赶上”下一次调用 - 它应该考虑所有到达的数据,除非是在新调用时到达的数据。当有数据不满足上述条件时永久返回 0。

第一个警告:InputStream 的具体子类负责 available()

InputStream是一个抽象类。它没有数据源。它拥有可用数据是没有意义的。因此,javadoc 为available()还指出:

The available method for class InputStream always returns 0.

This method should be overridden by subclasses.

事实上,具体的输入流类确实会覆盖 available(),提供有意义的值,而不是常量 0。

第二个警告:确保在 Windows 中键入输入时使用回车符。

如果使用System.in,您的程序仅在命令 shell 移交时接收输入。如果您使用文件重定向/管道(例如 somefile > java myJavaApp 或 somecommand | java myJavaApp ),则输入数据通常会立即移交。但是,如果您手动键入输入,则数据切换可能会延迟。例如。对于 Windows cmd.exe shell,数据在 cmd.exe shell 内缓冲。数据仅在回车(control-m 或<enter>)。这是执行环境的限制。当然,只要 shell 缓冲数据,InputStream.available() 就会返回 0 - 这是正确的行为;目前没有可用数据。一旦从 shell 获得数据,该方法就会返回一个 > 0 的值。注意:Cygwin 也使用 cmd.exe。

最简单的解决方案(无阻塞,因此不需要超时)

只需使用这个:

    byte[] inputData = new byte[1024];
    int result = is.read(inputData, 0, is.available());  
    // result will indicate number of bytes read; -1 for EOF with no data read.

或者等效地,

    BufferedReader br = new BufferedReader(new InputStreamReader(System.in, Charset.forName("ISO-8859-1")),1024);
    // ...
         // inside some iteration / processing logic:
         if (br.ready()) {
             int readCount = br.read(inputData, bufferOffset, inputData.length-bufferOffset);
         }

更丰富的解决方案(在超时时间内最大程度地填充缓冲区)

声明一下:

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);
         // can alternatively use bufferedReader, guarded by isReady():
         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
    // readCount will indicate number of bytes read; -1 for EOF with no data read.
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

是否可以从具有超时的输入流中读取? 的相关文章

  • 按键时关闭 ModalWindow

    我希望能够在用户按下某个键 在我的例子中是 ESC 时关闭 ModalWindow 我有一个用于按键的 Javascript 侦听器 它调用取消按钮 ID 的单击事件 jQuery modalWindowInfo closeButtonId
  • 不同帐户上的 Spring Boot、JmsListener 和 SQS 队列

    我正在尝试开发一个 Spring Boot 1 5 应用程序 该应用程序需要侦听来自两个不同 AWS 帐户的 SQS 队列 是否可以使用 JmsListener 注解创建监听器 我已检查权限是否正确 我可以使用 getQueueUrl 获取
  • 序列的排列?

    我有具体数量的数字 现在我想以某种方式显示这个序列的所有可能的排列 例如 如果数字数量为3 我想显示 0 0 0 0 0 1 0 0 2 0 1 0 0 1 1 0 1 2 0 2 0 0 2 1 0 2 2 1 0 0 1 0 1 1 0
  • Java 枚举与创建位掩码和检查权限的混淆

    我想将此 c 权限模块移植到 java 但是当我无法将数值保存在数据库中然后将其转换为枚举表示形式时 我很困惑如何执行此操作 在 C 中 我创建一个如下所示的枚举 public enum ArticlePermission CanRead
  • 如何循环遍历所有组合,例如48 选择 5 [重复]

    这个问题在这里已经有答案了 可能的重复 如何在java中从大小为n的集合中迭代生成k个元素子集 https stackoverflow com questions 4504974 how to iteratively generate k
  • 使用 LinkedList 实现下一个和上一个按钮

    这可能是一个愚蠢的问题 但我很难思考清楚 我编写了一个使用 LinkedList 来移动加载的 MIDI 乐器的方法 我想制作一个下一个和一个上一个按钮 以便每次单击该按钮时都会遍历 LinkedList 如果我硬编码itr next or
  • 在 Jar 文件中运行 ANT build.xml 文件

    我需要使用存储在 jar 文件中的 build xml 文件运行 ANT 构建 该 jar 文件在类路径中可用 是否可以在不分解 jar 文件并将 build xml 保存到本地目录的情况下做到这一点 如果是的话我该怎么办呢 Update
  • 如何更改javaFX中按钮的图像?

    我正在使用javaFX 我制作了一个按钮并为此设置了图像 代码是 Image playI new Image file c Users Farhad Desktop icons play2 jpg ImageView iv1 new Ima
  • java.lang.IllegalStateException:应用程序 PagerAdapter 更改了适配器的内容,而没有调用 PagerAdapter#notifyDataSetChanged android

    我正在尝试使用静态类将值传递给视图 而不是使用意图 因为我必须传递大量数据 有时我会收到此错误 但无法找出主要原因是什么 Error java lang IllegalStateException The application s Pag
  • 将流转换为 IntStream

    我有一种感觉 我在这里错过了一些东西 我发现自己做了以下事情 private static int getHighestValue Map
  • 内部类的构造函数引用在运行时失败并出现VerifyError

    我正在使用 lambda 为内部类构造函数创建供应商ctx gt new SpectatorSwitcher ctx IntelliJ建议我将其更改为SpectatorSwitcher new反而 SpectatorSwitcher 是我正
  • 如何访问JAR文件中的Maven资源? [复制]

    这个问题在这里已经有答案了 我有一个使用 Maven 构建的 Java 应用程序 我有一个资源文件夹com pkg resources 我需要从中访问文件 例如directory txt 我一直在查看各种教程和其他答案 但似乎没有一个对我有
  • 尝试将 Web 服务部署到 TomEE 时出现“找不到...的 appInfo”

    我有一个非常简单的项目 用于培训目的 它是一个 RESTful Web 服务 我使用 js css 和 html 创建了一个客户端 我正在尝试将该服务部署到 TomEE 这是我尝试部署时遇到的错误 我在这里做错了什么 刚刚遇到这个问题 我曾
  • 如何使用 jUnit 将测试用例添加到套件中?

    我有 2 个测试类 都扩展了TestCase 每个类都包含一堆针对我的程序运行的单独测试 如何将这两个类 以及它们拥有的所有测试 作为同一套件的一部分执行 我正在使用 jUnit 4 8 在 jUnit4 中你有这样的东西 RunWith
  • 专门针对 JSP 的测试驱动开发

    在理解 TDD 到底是什么之前 我就已经开始编写测试驱动的代码了 在没有实现的情况下调用函数和类可以帮助我以更快 更有效的方式理解和构建我的应用程序 所以我非常习惯编写代码 gt 编译它 gt 看到它失败 gt 通过构建其实现来修复它的过程
  • 包 javax.el 不存在

    我正在使用 jre6 eclipse 并导入 javax el 错误 包 javax el 不存在 javac 导入 javax el 过来 这不应该是java的一部分吗 谁能告诉我为什么会这样 谢谢 米 EL 统一表达语言 是 Java
  • 使用反射覆盖最终静态字段是否有限制?

    在我的一些单元测试中 我在最终静态字段上的反射中遇到了奇怪的行为 下面是说明我的问题的示例 我有一个基本的 Singleton 类 其中包含一个 Integer public class BasicHolder private static
  • 如果没有抽象成员,基类是否应该标记为抽象?

    如果一个类没有抽象成员 可以将其标记为抽象吗 即使没有实际理由直接实例化它 除了单元测试 是的 将不应该实例化的基类显式标记为抽象是合理且有益的 即使在没有抽象方法的情况下也是如此 它强制执行通用准则来使非叶类抽象 它阻止其他程序员创建该类
  • 双枢轴快速排序和快速排序有什么区别?

    我以前从未见过双枢轴快速排序 是快速排序的升级版吗 双枢轴快速排序和快速排序有什么区别 我在 Java 文档中找到了这个 排序算法是双枢轴快速排序 作者 弗拉基米尔 雅罗斯拉夫斯基 乔恩 本特利和约书亚 布洛赫 这个算法 在许多数据集上提供
  • 如何防止在Spring Boot单元测试中执行import.sql

    我的类路径中有一个 import sql 文件 其中包含一些 INSERT 语句 当使用 profile devel 运行我的应用程序时 它的数据被加载到 postgres 数据库中 到目前为止一切正常 当使用测试配置文件执行测试时 imp

随机推荐

  • linux下Java RandomAccessFile.java无法正常工作

    我试图在java中实现简单的tail f linux命令 这是我的代码 try position within the file File file new File home curuk monitored log txt RandomA
  • 如何使用 django-simple-history 存储 ManyToManyField 的历史记录。

    如何使用 django simple history 存储 ManyToManyField 的历史记录 我使用带有属性 m2m filds 的 HistoricalRecords 但它抛出错误 意外的关键字参数 m2m fields 我是
  • 增强 ggvis 轴

    我正在寻找增强图表的最佳方法 library dplyr library ggvis df lt data frame Year c 1954 2013 Count rep as integer c 1 3 4 2 15 df gt ggv
  • 使用 AppleScript 将 .rtf 文本复制到电子邮件正文中

    我有一个 AppleScript 应用程序 它可以创建一封电子邮件 在 Mail app 中 其中包含我通过对话框选择的选项中的附件 文本模板存储在 rtf格式 以便非程序员可以根据自己的意愿更改文本模板 我可以从以下地址创建电子邮件 tx
  • C++ 中并行向量的 find_first

    我有一个相当大的向量 一些向量成员并行地匹配某个条件 我想找到与条件匹配的第一个元素 我的问题与这个问题非常相似 tbb 并行查找第一个元素 但我没有tbb 检查条件非常繁琐 所以我无法依次对所有条件进行检查 这就是为什么我想并行运行它 我
  • php - 如何合并每个数组具有不同元素数的二维数组

    我有 2 组二维数组 我想合并成 1 个二维数组 但每个数组中的元素数量不相同 并且前 2 个元素相同 我不想重复它 这是它 第一个二维数组 Array 0 gt Array 0 gt 25 2 2013 1 gt 8 45 a m 2 g
  • Model View ViewModel / Knockout 解决什么问题? [关闭]

    Closed 这个问题需要多问focused 目前不接受答案 我在阅读某人的代码时遇到了 Knockout 和 MVVM 我对这两个主题都做了一些阅读 但我仍然对它们真正解决的问题感到困惑 很可能是因为我还没有构建足够大的应用程序来解决这个
  • 导入错误:没有名为 pandas 的模块

    我正在尝试用 Python 编写代码来获取 Twitter 数据 但没有收到 twython 错误 但我遇到了 Pandas 错误 我已经使用安装了 Pandaspip install pandas 但我仍然收到以下错误 我该如何修复它 F
  • ANTLR4 解析树简化

    有没有办法让 ANTLR4 自动删除生成的解析树中的冗余节点 更具体地说 我一直在尝试 GLSL 的语法 由于自动处理运算符优先级所需的规则转发 您最终会在解析树中得到长线性 表达式 序列 大多数生成的树节点只是 转发到下一个优先级 因此不
  • 如何更改图例的顺序

    我想改变图例的顺序 见图 我希望序列是 绿色和data2 蓝色和data3 黑色和data4 红色和data1 有人能给个demo吗 更改将图添加到图中的顺序 然后调用legend通常情况下 应该可以做到这一点 您也可以按如下方式进行 首先
  • 上传带有 Angular 材质和 Angular JS 的文件

    对于代码 我从中得到了灵感 https codepen io alexandergaziev pen JdVQQm 所以 对于 HTML 我这样做了 div class file input div div class file input
  • 使用C在eclipse中多重定义主要错误

    我正在尝试使用 Eclipse 中的 C 项目生成两个 exe 客户端和服务器 两者都有主要功能 因为他们是不同的前任 两者都使用通用的 confutils c 文件 如何解决主要问题的多重定义 我知道我们不能在一个项目中有两个电源 我的
  • 源中包含 < 和 > 的 XSLT 转换

    我有一个以下格式的输入 XML
  • 在 R 中重新编码多个变量

    我想在 R 中一次重新编码多个变量 这些变量位于更大的数据框中 以下是一些示例数据 z lt data frame A c 1 2 300 444 555 B c 555 444 300 2 1 C c 1 2 300 444 555 D
  • Angular UI Router - 如何在切换视图时保留视图

    我是 Angular 和 UI Router 的新手 Plunk http plnkr co edit 1wfyrGryfGG5RtXozPFY p preview Setup我有三个顶级应用程序导航按钮 主页 项目 帮助 他们使用 Ang
  • R.java 文件未创建

    我的 Android 应用程序中有 R java 文件 但我不知道 它是如何删除的 要再次创建它 我清理我的项目 并通过单击 构建项目 重建我的项目 我不知道是什么问题 它不会再次被创建 一般来说 每当我构建项目时它都会自动创建 如果您在更
  • firebase获取每个子项的子项的数据

    大家好 我是 firebase 的超级新手 我需要一些帮助 首先 我正在做的是一份清单 例如 刻度表包含一个项目列表 其中包含刻度日志 因此我设计的数据如下 清单 ticksheets JbN5ol2jGRtAOZ9ovrO auto ge
  • noscript 标签,如果未启用,我需要提供替代 html

    如果用户浏览器上未启用 JavaScript 是否可以用 HTML 替换 javascript 我知道我可以使用
  • 当以 C++03 为目标时,使用 std::basic_string 作为连续缓冲区是否合理?

    我知道在 C 03 中 从技术上讲std basic string模板不需要有连续的内存 然而 我很好奇现代编译器有多少实现实际上利用了这种自由 例如 如果有人想使用basic string要接收某些 C API 的结果 如下面的示例 分配
  • 是否可以从具有超时的输入流中读取?

    具体来说 问题是编写一个这样的方法 int maybeRead InputStream in long timeout 如果数据在 超时 毫秒内可用 则返回值与 in read 相同 否则返回 2 在该方法返回之前 任何生成的线程都必须退出