.listFiles()可以在不同的系统上以不同的顺序返回文件

时间:2012-08-03 20:58:07

标签: java

作为处理的结果,一些数据文件被写入磁盘。

  • 2台服务器(MAC和Linux)之间的文件数匹配
  • 系统之间的文件名相同
  • 系统之间的文件内容相同,由md5sum
  • 衡量

然后使用

根据从所述文件读取的内容计算报告
    for (File f : contentDirectory.listFiles()) {
               // magic

.listFiles() javadoc说:

  

无法保证结果数组中的名称字符串   将以任何特定顺序出现;特别是,它们不是   保证按字母顺序出现。

虽然这是真的,但我想知道......列出文件的顺序不是随机的,对吧?我的意思是,列出相同的文件2次会产生相同的结果这是正确的吗?

这是否意味着当文件列在2个不同的系统上时,顺序可能不一样?

最重要的问题是,如何以相同的顺序列出目录中的文件而不管操作系统文件是否存储?

4 个答案:

答案 0 :(得分:5)

他们不对订单提供任何保证。所以不要依赖它。即使您可以验证它今天是否有效,但明天可能无法正常工作。或者包含超过4K文件的列表。或者你不了解的其他一些随机标准。

如果您想订购,那很容易。在迭代之前对列表进行排序。

答案 1 :(得分:2)

我希望订单依赖于本地JVM和/或本地文件系统的实现细节。最有可能的是,文件的列出顺序与该文件夹的文件系统目录的顺序相同,这可能取决于文件添加到文件夹的顺序或其他此类详细信息。

如果您的程序依赖于某个顺序的文件,最好的办法是获取文件名列表,然后根据需要对它们进行排序,然后打开文件。这样,您就不依赖于本地实现细节。

答案 2 :(得分:2)

只需对文件进行排序。 File具有可比性,因此我们甚至不需要比较器:

File[] files = File.listRoots()[0].listFiles();
Arrays.sort(files);
System.out.println(Arrays.asList(files));

(这个例子只是从第一个根目录获取文件,每个计算机上应该有一些内容;)

替代

文件对象应该是唯一的,因此我们可以创建一个树集:

for (File file : new TreeSet<File>(Arrays.asList(contentDirectory.listFiles()))) {
    System.out.println(file.getName());  // replace with magic ;)
}

答案 3 :(得分:0)

public class File  implements Serializable, Comparable<File>
因此,如果将文件转储到List中,

java.util.Collections.sort()将很好地工作。

阅读Java 7的发行说明,您将看到许多“不保证”发生变化的情况,以及其他“非公开”api被删除或更改的地方。如果医生说你不能依赖它,你就不能依赖它。它可以在任何主要或次要版本中发生变化。