【问题标题】:Why does InputStreamReader read() block instead of returning -1?为什么 InputStreamReader read() 阻塞而不是返回-1?
【发布时间】:2012-01-21 15:11:34
【问题描述】:

我正在使用 java 的 InputStreamReader read() 函数。当我到达输入流的末尾时,我应该进入我的 int 变量 -1 的值,但相反它会阻塞。 为什么我在输入流的末尾没有得到 -1? (我已经逐个字母地调试它,确保它实际上是输入的结尾并且连接套接字是活动的)。

使用 ready() 函数是一个很好的解决方案吗:

if (isr.ready())
    currCharVal = isr.read();

提前致谢, 伙计。

【问题讨论】:

  • 底层InputStream是什么?你能发布更多代码吗?
  • 定义输入流的“结束”——流可以是任何东西,包括永无止境的网络连接。它的处理方式取决于流类型。
  • "...连接套接字是活动的" - 只要套接字没有关闭,就套接字而言,您还没有到达输入流的末尾。
  • 我收到来自 cURL 的 httprequest。我使用标记器读取每个标记 128 个字符。在读取最后一个令牌时,isr.read() 刚刚进入阻塞模式,因为它完成了获取消息。
  • @Guy 这意味着无论出于何种原因,cURL 都不会关闭您正在读取的流。

标签: java block blocking inputstreamreader


【解决方案1】:

如果另一端没有关闭连接,就会发生这种情况。当套接字关闭时,read() 将返回 -1。

根据我的经验,使用 ready 和 available 是相当不可预测的。我会一直阅读(byte[]) 直到到达终点,并期望另一端在完成后关闭。

【讨论】:

  • 我需要保持连接处于活动状态,因为会根据输入生成答案。所以我明白为什么 -1 不是知道输入何时完成的好方法。是否有另一种方法可以确定客户端何时停止在我的标记器中发送 httprequest 数据?
  • 我会假设您已获得内容长度以知道它何时完成该响应。你不能发送 -1 做一个流。
猜你喜欢
  • 2011-04-10
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2022-11-02
  • 1970-01-01
  • 2015-12-03
  • 1970-01-01
  • 2020-08-10
相关资源
最近更新 更多