【问题标题】:Is BufferedInputStream.available() Reliable in Socket Programming?Socket 编程中 BufferedInputStream.available() 可靠吗?
【发布时间】:2012-08-18 11:43:42
【问题描述】:

available() 在 Java 中用于套接字编程是否可靠?

我只关心它告诉我何时有字节可供读取,这样当我调用读取方法时它们不会阻塞。

BufferedInputStream.available() 依赖于InputStream.available()

InputStream.available() 的文档是这样说的:

请注意,虽然 InputStream 的某些实现会返回 流中的总字节数,很多不会。它从来不是 正确使用此方法的返回值分配缓冲区 旨在保存此流中的所有数据。 http://docs.oracle.com/javase/6/docs/api/java/io/InputStream.html#available()

我不在乎它是否给出了正确的字节数,只是当有字节可供读取时它不会给我 0。我想知道 BufferedInputStream.available() 是否总是在 Windows 和 Linux 上用于此目的。

另外,我不确定文档中的“实现”是什么意思。那指的是什么? InputStream 的子类?不同操作系统上的Java?到不同的JVM?

有没有人在 Windows 或 Linux 或其他系统上使用过 available() 但没有用?

【问题讨论】:

  • 永远不要使用available。曾经。如果您想在bytes 可用于reading 时收到通知,请查看non-blocking IO
  • 从不使用available的原因是什么?如果我们永远不应该使用它,那它为什么存在呢?
  • 如果您确定您知道available 将如何与您的特定InputStream 一起使用,那么您可以使用它。然而,InputStream 的大多数用法归结为FileInputStreamSocket.getInputStream(),两者都不能保证返回正确的available 值。
  • @TedHopp @mudge available 的问题是它总是可以返回 0 并且永远不会出错。最好不要依赖 available 作为任何指标。
  • @mudge No. 阅读该方法的规范:some implementations of InputStream will return the total number of bytes in the stream, many will not。这意味着available 方法可以或多或少地返回它想要的任何值。

标签: java sockets inputstream bufferedinputstream


【解决方案1】:

包裹在 SSLSocket 上时绝对可靠,正如我已经在您的 other thread 中告诉您的那样。它总是返回零。

【讨论】:

    【解决方案2】:

    您在问题中链接到的同一文档说:

    单次读取或跳过这么多字节不会阻塞,但可能会读取或跳过更少的字节。

    所以我会说它是“安全的”,因为当 I/O 不返回 0 时它不会阻塞。另一方面,不能保证它会在有时返回非零,事实上,要读取的字节数。

    注意InputStream 是一个抽象类,所以你拥有的任何InputStream 对象都必然是一个子类。这就是文档所说的“实施”的意思。任何具体的子类都将实现所有抽象方法。

    【讨论】:

    • @mudge 如果您真的想要非阻塞 I/O,请尝试查看 NIO
    猜你喜欢
    • 1970-01-01
    • 2012-03-05
    • 2013-01-18
    • 2011-08-26
    • 2011-01-08
    • 2021-04-02
    • 1970-01-01
    • 2015-12-18
    • 1970-01-01
    相关资源
    最近更新 更多