3

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

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

然后根据从所述文件中读取的内容计算报告,使用

    for (File f : contentDirectory.listFiles()) {
               // magic

.listFiles()javadoc 说:

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

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

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

最终更大的问题是,如何以相同的顺序列出目录中的文件,而不管 OS 文件是否存储在其中?

4

4 回答 4

5

他们不对订单提供任何保证。所以不要依赖它。即使您可以验证它今天可以工作,它明天也可能无法工作。或者在超过 4K 文件的列表中。或者您不知道的其他一些随机标准。

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

于 2012-08-03T21:02:04.793 回答
2

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

如果您的程序依赖于按特定顺序排列的文件,最好的办法是获取文件名列表,按您喜欢的方式对它们进行排序,然后打开文件。这样,您就不会依赖于本地实施细节。

于 2012-08-03T21:02:38.590 回答
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 ;)
}
于 2012-08-03T21:07:26.583 回答
0
public class File  implements Serializable, Comparable<File>

java.util.Collections.sort()因此,如果您将文件转储到列表中,它将很好地工作。

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

于 2012-08-03T21:06:43.323 回答