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

Java:数据可用性、关闭状态等的InputStream约定,java,io,Java,Io,我有一个InputStream,它被设置为处理本地文件,但我想添加稍后通过网络读取文件的功能。我假设InputStream已经为此做好了准备 我遇到的问题是,显然InputStream不能保证在任何给定时间都有可用的数据,而且数据可能在以后变得可用。我不确定我是否理解正确。没有方法确定可用数据的绝对大小(字节数),甚至无法确定InputStream是否已关闭。似乎如果那里有一个文件,它一定有可用的东西。处理InputStream的方法可能会从中读取数据,如果没有可用的数据,就没有任何理由保留它。

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

我遇到的问题是,显然InputStream不能保证在任何给定时间都有可用的数据,而且数据可能在以后变得可用。我不确定我是否理解正确。没有方法确定可用数据的绝对大小(字节数),甚至无法确定InputStream是否已关闭。似乎如果那里有一个文件,它一定有可用的东西。处理InputStream的方法可能会从中读取数据,如果没有可用的数据,就没有任何理由保留它。更糟糕的是,我甚至不知道是否有可用的数据


所以我的问题是,对于通过网络或本地读取的文件,如何确定它是否打开/关闭,以及可能确定另一端的文件大小?为什么这个类如此简单?

java.io.Inputstream做一件事,而且只做一件事。它提供了一个从…读取字节数据的接口。。。任何东西它可以是一个文件,一个HTPP网站,一个数据库,任何决定提供输入流的东西。因此,它是赤裸裸的,正是因为这种简单性使它具有普遍性。例如,输入流可用于流式直播电视。在这种情况下,没有长度的内容,因为你可以永远流。因此,如果InputStream提供了一个长度为内容的特性,那么它对于无穷无尽的流将变得毫无用处


一天结束后,你将不得不在输入流的基础上进一步使用这项技术来确定事物的存在。例如,将File.exists用于文件存在,将404错误用于HTTP不存在,或将数据库异常用于数据库不存在。当您想从文件中读取字节时,只需查看Inputstream,因为这就是它要做的全部工作。不多也不少。


一天结束后,你将不得不在输入流的基础上进一步使用这项技术来确定事物的存在。例如,将File.exists用于文件存在,将404错误用于HTTP不存在,或将数据库异常用于数据库不存在。当您想从文件中读取字节时,只需查看Inputstream,因为这就是它要做的全部工作。不多也不少。

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

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

我不知道你通过网络读取文件的确切意思。如果这意味着从远程文件系统(例如通过NFS)读取文件,则可以使用
file
类中的
length()
方法获取文件大小:

File file = new File("/path/to/file");
System.out.println(file.length());
您可以使用通过调用“FileInputStream”对象上的
getFD()
方法获得的
FileDescriptor
实例上的
valid()
方法来确定
FileInputStream
是否打开:

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

当然,请记住,

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

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

我不知道你通过网络读取文件的确切意思。如果这意味着从远程文件系统(例如通过NFS)读取文件,则可以使用
file
类中的
length()
方法获取文件大小:

File file = new File("/path/to/file");
System.out.println(file.length());
您可以使用通过调用“FileInputStream”对象上的
getFD()
方法获得的
FileDescriptor
实例上的
valid()
方法来确定
FileInputStream
是否打开:

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

当然,请记住适用。

我了解这里的客户机/服务器动态数据流功能,但对于通过网络处理文件,这不是处理该数据的好方法。我了解这里的客户机/服务器动态数据流功能,但对于通过网络处理文件,如果我连接到一个由HTTP服务器托管的文件,那么这不是处理该数据的好方法。已知该文件仅为静态文件(无动态数据),并且始终为固定大小。是否有一个类可以用于读取这样一个文件,该类将提供length()和valid()方法,并且也适用于本地文件?假设我连接到一个由HTTP服务器托管的文件。已知该文件仅为静态文件(无动态数据),并且始终为固定大小。是否有一个类可以用来读取这样一个文件,它将给出length()和valid()方法,并且也适用于本地文件?