Java:用于数据可用性、关闭状态等的 InputStream 约定

标签 java io

我有一个设置为处理本地文件的 InputStream,但想添加稍后通过网络读取文件的功能。我假设 InputStream 已经为此做好了准备。

我遇到的问题是,显然 InputStream 不能保证在任何给定时间都有可用数据,并且数据可能稍后可用。不确定我是否理解正确。没有方法可以确定可用数据的绝对大小(以字节数表示),或者即使 InputStream 已关闭。似乎如果那里有文件,它必须有可用的东西。处理 InputStream 的方法可能会从中读取数据,如果没有可用数据,则没有任何理由保留它。更糟糕的是,我什至无法确定是否有可用的数据。

所以我的问题是,对于通过网络或本地读取的文件,我如何确定它是打开/关闭,并可能确定另一端文件的大小?为什么这门课这么空?

最佳答案

InputStream 抽象类用于从任何源读取字节,而不仅仅是文件。它的后代为特定来源提供方法。例如,FileInputStream 可用于从文件中读取字节,而 SocketInputStream 可用于从套接字中读取字节。

这就是为什么 InputStream 不提供任何确定文件大小的方法,因为它对文件以外的源没有意义。

我不确定您所说的通过网络读取文件到底是什么意思。如果这意味着从远程文件系统(例如通过 NFS)读取文件,那么您可以使用 File 类中的 length() 方法来获取文件的大小:

File file = new File("/path/to/file");
System.out.println(file.length());

您可以使用 FileDescriptor 实例上的 valid() 方法来确定 FileInputStream 是否打开,该实例通过调用 “FileInputStream”对象上的 >getFD() 方法:

boolean isOpen(FileInputStream stream)
{
    return stream.getFD().valid();
}

当然,请记住 Law of Leaky Abstractions适用。

关于Java:用于数据可用性、关闭状态等的 InputStream 约定,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8109276/

相关文章:

java - 无法连接到 TitanDB - 具有相同实例 ID [] 的 Titan 图已经打开。可能需要强制关机

java - 如何提取类文件以获取该类文件中的类?

io - OCaml 格式和结构框 : Why does my output not match the example?

python - 平均超过 N 个文件

内存映射 I/O 与端口映射 I/O

Java 需要帮助来关闭 Stream

Java 西里尔字母编码

java - 如何将 JSON 中的 Java 对象的实例类型发送到 Java Spring-Server Post 请求?

java - Caused by : java. lang.IllegalArgumentException : CONTAINING (1): [IsContaining, Containing, Contains]不支持redis查询推导-Redis

java - 当我将 localhost 更改为服务器上的主机时,为什么会出现错误?