Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/file/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 只有FileDescriptor才能获得文件大小吗?_Java_File_File Descriptor - Fatal编程技术网

Java 只有FileDescriptor才能获得文件大小吗?

Java 只有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(

让我们假设我有一个有效的Java
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的具体原因?@user1723095
    File
    表示可能指向或可能不指向现有文件的单个路径
    FileDescriptor
    始终指向现有文件,但该文件可能存在于多个路径下。@Tunaki我知道available可能会返回一个错误的结果,但是
    getChannel()?
    
    public long getSize(FileDescriptor fd) throws IOException {
        try (FileInputStream fis = new FileInputStream(fd)) {
            return fis.getChannel().size();
        }
    }