我有一个设置为处理本地文件的 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/