究竟是什么读取/块保证DataInputStream提供以下可用()

时间:2017-09-15 03:12:25

标签: java io network-programming datainputstream

我已经阅读了java文档和一些相关问题,但我不确定以下内容是否可以保证有效:

我在专用线程上有一个DataInputStream,它从一个非常活跃的连接中不断读取已知字节大小的少量数据。当流变为非活动状态(即网络中断)时,我想提醒用户,所以我实现了以下内容:

 <main class="container">
    <form>
      <ul class="row">
        <li class="col-lg-6 col-md-6 col-sm-6 col-xs-12">
          <fieldset>
            <label class="label">Firstname</label>
            <input type="text" value="Firstname" class="form-input form-control" />
          </fieldset>
           <fieldset>
            <label class="label">Lastname</label>
            <input type="text" value="Lastname" class="form-input form-control" />
          </fieldset>         
        </li>
        <li class="col-lg-6 col-md-6 col-sm-6 col-xs-12">
           <fieldset>
            <label class="label">Username</label>
            <input type="text" value="Username" class="form-input form-control" />
          </fieldset>
           <fieldset>
            <label class="label">Password</label>
            <input type="password" value="Password" class="form-input form-control" />
          </fieldset>          
        </li>
      </ul>      
    </form>
  </main>

available()的文档说明:

  

返回估计可以从此输入流读取(或跳过)的字节数,而不会被此输入流的方法的下一个调用方阻塞。下一个调用者可能是同一个线程或另一个线程。 单个读取或跳过这么多字节不会阻塞,但可以读取或跳过更少的字节。

这是否意味着下一次读取(在readInt()内部)可能只读取2个字节,后续读取完成检索整数可能会阻塞?我意识到readInt()是一个'next next'流的方法,但我认为它必须在读取调用上循环,直到它获得4个字节并且文档没有提到后续调用。在上面的例子中,即使waitOnStreamForState(stream,4)返回STREAM_STATE_ACTIVE,readInt()调用仍然可能会阻塞?

(是的,我意识到我的超时机制并不准确)

1 个答案:

答案 0 :(得分:0)

  

这是否意味着下一次读取(在readInt()内部)可能只读取2个字节,后续读取完成检索整数可能会阻塞?

它说的是什么。但至少下一个read()赢了。

  

我意识到readInt()是一个流的方法,被称为“下一个”流。但我认为它必须循环读取调用,直到它获得4个字节并且文档不提及后续调用。在上面的例子中,即使waitOnStreamForState(stream,4)返回STREAM_STATE_ACTIVE,readInt()调用仍然可以阻塞吗?

它说的是什么。

例如,考虑使用SSL。您可以看出有可用的数据,但是如果没有实际删除它就无法说明多少,因此JSSE实现可以免费使用:

  • 始终从available()返回0(这是以前的做法)
  • 如果底层套接字的输入流有available() > 0,则
  • 始终返回1,否则为零
  • 返回底层套接字输入流的available()值,如果实际明文数据较少,则依赖此措辞使其免于麻烦。 (但是,如果密码数据完全由握手消息或警报组成,则正确的值可能仍为零。)

但是你不需要这些。您只需要一个读取超时,通过Socket.setSoTimeout()设置,catch设置为SocketTimeoutExceptionavailable()的正确用法很少:随着时间的推移越来越少,在我看来。你当然应该浪费时间来调用sleep()