Java File.list()一致的顺序?

时间:2011-06-30 18:45:11

标签: java

这是一个非常糟糕的问题(在我看来),我尽力找到自己有用的文档,运气不大 - 无论如何,这里有:

我的代码需要对目录中的所有文件执行某些操作。我在File对象中设置目录,并使用fileObject.list()迭代目录中的文件。我让这段代码在一夜之间运行,并且(经过多次骚动)在某些时候崩溃了。我想弄清楚这发生了什么事(是的,我记录得很糟糕)。现在,根据this javadoc,在列出文件时无法保证订单(按字母顺序或其他方式),我想知道是否有任何一致性保证?这意味着当我运行相同的代码两次时,我会得到完全相同的文件顺序吗?逻辑告诉我它应该并且我已经恢复了基于此的操作,但我对此持怀疑态度。此外,我很好奇javadoc中“没有具体的订单意味着什么”。

4 个答案:

答案 0 :(得分:13)

该语言意味着您不应该依赖订单的任何属性,包括从运行到运行的一致性。

如果某些内存数据结构中存在链接的文件列表,则驱动程序可能会将最近访问的文件移动到列表的前面,以优化重复的文件访问。即使没有修改文件,这也可能会改变列出文件的顺序。

如果您想要一致的订单,您可以执行类似

的操作
Arrays.sort(
   myFileArray,
   new Comparator<File>() {
     public int compare(File a, File b) {
       return a.getName().compareTo(b.getName());
     }
   });

答案 1 :(得分:0)

鉴于您正在查看的文件在两次调用之间没有变化,并且假设您在完全相同的平台上运行两次,我认为您将获得相同的结果。

答案 2 :(得分:0)

不保证订单,但AFAIK没有“保证不一致”,因此,如果没有任何文件被更改或以任何方式触摸,则调用它两次,可能会给您相同的订单。但是,如果你正在“处理”它们,它们可能已被触及。

但是为了理智,如果你要依赖一致性,我建议你在获得它们时对它们进行排序。

答案 3 :(得分:0)

正如文档所说,你不能指望任何文件的排序。特别是,两个后续调用可以返回不同的顺序。如果您希望特定订购,例如按字母顺序排列,您需要自己对列表进行排序。