File.length() 返回值为0

3

我正在尝试获取一些文件的长度(以字节为单位)。问题是,当它们的长度不为零时,我得到的长度为零(我检查过了!)

此外,我对这些文件使用的其他方法都可以正常工作。所以这只是长度的问题。

为什么会发生这种情况?

谢谢。

最初的回答:

您可能没有正确打开文件或读取文件。请确保在获取文件长度之前正确打开文件,并使用适当的方法读取文件内容。

    //add all files names in the directory into array
    String[] files = new File(sourcedir).list();
    filesNamesList.addAll(Arrays.asList(files));
    filesNamesList.removeIf(name -> ((new File(sourcedir + PATH_BACK_SLASH + name))
            .isDirectory()));

    for (String f:files){
        File e =  new File(f);
        System.out.println((e).length());

    }
}

1
我不认为这与您的问题有任何关系,但在从列表中删除目录时,请尝试使用构造函数File(sourcedir,name) - Robert Kock
输出如下: 0 0 0 0 0 0 0 0 0 0 0 0 - Hadar
请查看:https://dev59.com/fHI95IYBdhLWcg3wyRM0 - Alin
看起来是重复的 https://dev59.com/IGw05IYBdhLWcg3w4125 - Oleks
这回答您的问题吗?获取文件夹或文件大小 - Soorya J
4个回答

1
值得一提的是,使用 File.getAbsolutePath() 检查文件的绝对路径,以确保该函数是否提供了正确的文件路径。

1

你正在使用的list()方法列出了文件的名称,而不是它们的绝对路径

因此,你的代码列出了sourcedir中的所有文件名(而不是它们的完整路径),然后在你运行程序的当前目录中查找这些相同的文件名。这就是为什么length()对于所有这些文件都返回0(根据文档, 如果文件不存在,它将返回0)。

如果你想要一个包含所有绝对路径的列表,那么你可以使用流来简洁地实现:

List<String> files = Arrays.stream(new File("C:\\users\\michael\\desktop").listFiles())
        .map(f -> f.getAbsolutePath())
        .collect(Collectors.toList());

然而,如果所有这些文件都只来自同一个目录,那么在您的for循环中使用new File(sourcedir, name)(这比您在其他地方使用的new File(sourcedir + PATH_BACK_SLASH + name)更好)。


0

您的文件路径可能不正确。

Java的File.length()Javadoc说明,如果未找到文件,则length()可能返回0L。

此抽象路径名表示的文件的字节数,如果文件不存在,则为0L。一些操作系统可能会针对表示设备或管道等系统相关实体的路径名返回0L。”

因此,如果您确定文件中有内容,则很可能未正确找到它们。请仔细检查文件路径,然后重试。

此外,javadoc建议使用Files.readAttributes()获取更详细的错误信息; 我在这里也表示同意。


1
谢谢!我应该使用文件的绝对路径而不仅仅是它们的名称。谢谢! - Hadar
不客气。如果这个答案对您有帮助,请考虑点赞。并且一定要点击勾选标记,将其作为正确答案接受。 - Austin Schaefer

-1
问题在于这些文件中没有任何内容。因此,您的输出为0。

但它们都包含内容。 - Hadar
我在目录中查看它们的属性,发现它们的长度不为零:35.8 KB、13.8 KB 等。 - Hadar

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接