Java 只有FileDescriptor才能获得文件大小吗?
让我们假设我有一个有效的JavaJava 只有FileDescriptor才能获得文件大小吗?,java,file,file-descriptor,Java,File,File Descriptor,让我们假设我有一个有效的JavaFileDescriptor,我是这样得到的: FileInputStream is = new FileInputStream("/some/path/to/file.txt"); FileDescriptor fd = is.getFD(); 现在请忘记我知道文件路径。我只有一个文件描述符。是否有一种简单的方法可以知道文件大小? 现在我已经检查过了: FileDescriptor有valid()方法,可以告诉我它是否有效 但是没有length()或size(
FileDescriptor
,我是这样得到的:
FileInputStream is = new FileInputStream("/some/path/to/file.txt");
FileDescriptor fd = is.getFD();
现在请忘记我知道文件路径。我只有一个文件描述符
。是否有一种简单的方法可以知道文件大小?
现在我已经检查过了:
FileDescriptor
有valid()
方法,可以告诉我它是否有效
但是没有length()
或size()
功能FileInputStream
不返回路径,因为它是一个流
显然不会告诉我文件大小文件
()
具有length()
方法的构造函数无法处理
文件描述符我知道我可以读取整个流并计算长度,但我不认为它是<强>简单的方式< /强> .< /p> 一个简单的方法是得到<代码>文件通道< /C> >():
然而,正如相关问题所说,没有强有力的保证这将适用于所有操作系统唯一可靠且兼容的方法是读取流的内容,正如您在问题中所说。您是否尝试过inputStream.available()?否,因为API()声明函数返回:可以读取(或跳过)的字节数的估计值从这个输入流中不阻塞,或者当它到达输入流的末尾时为0。@Stefan它可靠吗?这是一个估计值,仅包括非阻塞。我想在一个文件上可以,但我不认为有任何保证。一个一般性的问题:使用
getChannel().size()
和available()
有什么区别?我想@nafas涵盖了这一点。谢谢,在我的情况下它是有效的。顺便说一句,您是否看到文件的构造函数无法处理FileDescriptor的具体原因?@user1723095File
表示可能指向或可能不指向现有文件的单个路径FileDescriptor
始终指向现有文件,但该文件可能存在于多个路径下。@Tunaki我知道available可能会返回一个错误的结果,但是getChannel()?
public long getSize(FileDescriptor fd) throws IOException {
try (FileInputStream fis = new FileInputStream(fd)) {
return fis.getChannel().size();
}
}