java - BufferedInputStream.available() 在套接字编程中可靠吗?

标签 java sockets inputstream bufferedinputstream

在 Java 套接字编程中使用 available() 可靠吗?

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

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

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

Note that while some implementations of InputStream will return the total number of bytes in the stream, many will not. It is never correct to use the return value of this method to allocate a buffer intended to hold all data in this stream. http://docs.oracle.com/javase/6/docs/api/java/io/InputStream.html#available()

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

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

有人在 Windows 或 Linux 或其他系统上使用过 available() 但它不起作用吗?

最佳答案

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

A single read or skip of this many bytes will not block, but may read or skip fewer bytes.

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

请注意,InputStream 是一个抽象类,因此您拥有的任何 InputStream 对象都必须是子类。这就是文档中“实现”的含义。任何具体子类都将实现所有抽象方法。

关于java - BufferedInputStream.available() 在套接字编程中可靠吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12083493/

相关文章:

Java尝试使用资源输入流空检查

java - 预期的类或接口(interface),这个简单的代码有什么问题?

java - 使用 json 反序列化 java 泛型集合

Java InputStream 阻塞读取

java - 套接字传输

linux - 围绕 nc 命令编写的 bash 脚本。如何在每行之前添加文本?

小程序 url 的 java.net.MalformedURLException

C socket 麻烦

sockets - Golang - 为到不同服务器的多个连接扩展 websocket 客户端

java - 为什么 Integer.parseInt 在看似有效的输入上抛出 NumberFormatException?