2015-11-11 73 views
3

让我们假设我有一个有效的Java FileDescriptor这是我在这样得到:有没有办法让文件大小只有FileDescriptor?

FileInputStream is = new FileInputStream("/some/path/to/file.txt"); 
FileDescriptor fd = is.getFD(); 

现在请忘记我知道文件的路径。我唯一拥有的是FileDescriptor。有没有简单的方法知道文件的大小? 现在我已经检查了:

  1. FileDescriptorvalid()方法,可以告诉我,如果它是有效的 但没有length()size()功能。
  2. FileInputStream不返回的路径和因为它是一个流它 显然不会告诉我的文件大小。
  3. Filehttp://docs.oracle.com/javase/7/docs/api/java/io/File.html) 其中length()方法没有能够处理的构造函数 FileDescriptor。

我知道我可以读取整个流并总结长度,但我不认为它是简单的方法

+1

您是否尝试过inputStream.available()? – Stefan

+2

否因为API(http://docs.oracle.com/javase/7/docs/api/java/io/InputStream.html#available%28%29)指出函数返回:字节数的估计值即可以从这个输入流中读取(或跳过)而不阻塞,或者当它到达输入流的末尾时读取(或跳过)。 – user1723095

+0

@Stefan它会可靠吗?这是一个估计,只涵盖非阻塞。我想在一个文件上它可能是好的,但我不认为有任何保证。 –

回答

4

一个简单的办法是让FileChannelrefer to this question)的大小:

public long getSize(FileDescriptor fd) throws IOException { 
    try (FileInputStream fis = new FileInputStream(fd)) { 
     return fis.getChannel().size(); 
    } 
} 

然而,作为所述链接的问题,也没有强有力的保证,这将为所有OS工作。

唯一可靠和兼容的方式是读取流的内容,就像你在你的问题说。

+0

一个普遍的问题:使用'getChannel()。size()'和'available()'有什么区别? – nafas

+1

@nafas我认为[这个答案](http://stackoverflow.com/a/23147743/1743880)覆盖它。 – Tunaki

+0

感谢它在我的情况。顺便说一句。你有没有看到为什么File没有能够处理FileDescriptor的构造函数? – user1723095

相关问题