有没有办法让只有 FileDescriptor 的文件大小?
Is there a way to get file size having only FileDescriptor?
假设我有一个有效的 Java FileDescriptor
,我是通过这种方式得到的:
FileInputStream is = new FileInputStream("/some/path/to/file.txt");
FileDescriptor fd = is.getFD();
现在请忘记我知道文件路径。我唯一拥有的是 FileDescriptor
。有没有简单的方法知道文件大小?
现在我已经检查过:
FileDescriptor
有 valid()
方法可以告诉我它是否有效
但没有 length()
或 size()
功能。
FileInputStream
没有 return 路径,因为它是一个流
显然不会告诉我文件大小。
File
(http://docs.oracle.com/javase/7/docs/api/java/io/File.html)
具有 length()
方法的构造函数无法处理
文件描述符。
我知道我可以读取整个流并对长度求和,但我不认为它是简单的方法。
一个简单的方法是获取 FileChannel
(refer to this question) 的大小:
public long getSize(FileDescriptor fd) throws IOException {
try (FileInputStream fis = new FileInputStream(fd)) {
return fis.getChannel().size();
}
}
但是,如链接问题所述,并不能有力保证这对所有人都有效 OS。
唯一可靠且兼容的方法是读取流的内容,就像您在问题中所说的那样。
假设我有一个有效的 Java FileDescriptor
,我是通过这种方式得到的:
FileInputStream is = new FileInputStream("/some/path/to/file.txt");
FileDescriptor fd = is.getFD();
现在请忘记我知道文件路径。我唯一拥有的是 FileDescriptor
。有没有简单的方法知道文件大小?
现在我已经检查过:
FileDescriptor
有valid()
方法可以告诉我它是否有效 但没有length()
或size()
功能。FileInputStream
没有 return 路径,因为它是一个流 显然不会告诉我文件大小。File
(http://docs.oracle.com/javase/7/docs/api/java/io/File.html) 具有length()
方法的构造函数无法处理 文件描述符。
我知道我可以读取整个流并对长度求和,但我不认为它是简单的方法。
一个简单的方法是获取 FileChannel
(refer to this question) 的大小:
public long getSize(FileDescriptor fd) throws IOException {
try (FileInputStream fis = new FileInputStream(fd)) {
return fis.getChannel().size();
}
}
但是,如链接问题所述,并不能有力保证这对所有人都有效 OS。
唯一可靠且兼容的方法是读取流的内容,就像您在问题中所说的那样。