【问题标题】:Is there a way to get file size having only FileDescriptor?有没有办法获得只有 FileDescriptor 的文件大小?
【发布时间】:2015-11-11 11:00:17
【问题描述】:

假设我有一个有效的 Java FileDescriptor,我是通过这种方式获得的:

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

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

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

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

【问题讨论】:

  • 你试过 inputStream.available() 吗?
  • 否,因为 API (docs.oracle.com/javase/7/docs/api/java/io/…) 声明函数返回:估计可以从该输入流中读取(或跳过)的字节数而不会阻塞或到达末尾时为 0输入流。
  • @Stefan 可靠吗?这是一个估计值,仅涵盖非阻塞。我猜在文件上可能没问题,但我认为没有任何保证。

标签: java file file-descriptor


【解决方案1】:

一种简单的方法是获取FileChannel (refer to this question) 的大小:

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

但是,正如链接的问题所述,不能保证这适用于所有操作系统。

唯一确定且兼容的方法是读取流的内容,就像您在问题中所说的那样。

【讨论】:

  • 一个一般性问题:使用getChannel().size()available() 有什么区别?
  • @nafas 我认为this answer 涵盖了它。
  • 感谢它适用于我的情况。顺便提一句。您是否看到 File 没有能够处理 FileDescriptor 的构造函数的任何特殊原因?
  • @user1723095 File 表示可能指向也可能不指向现有文件的单个路径。 FileDescriptor 始终指向一个现有文件,但该文件可能存在于多个路径下。
  • @Tunaki 我知道 available 可能会返回一个错误的结果,但 getChannel().size() 是否总是正常工作,返回文件的大小?
猜你喜欢
  • 1970-01-01
  • 2017-04-27
  • 1970-01-01
  • 2019-08-20
  • 2011-04-20
  • 1970-01-01
  • 1970-01-01
  • 2021-12-17
  • 1970-01-01
相关资源
最近更新 更多