【问题标题】:Java File.list() consistent order?Java File.list() 顺序一致?
【发布时间】:2011-09-26 05:51:21
【问题描述】:

这是一个可怕的问题(在我看来),我已经尽力为自己找到有用的文档,但运气不佳 - 无论如何,这里是:

我有代码需要对目录中的所有文件进行一些操作。我在 File 对象中设置了目录,并使用 fileObject.list() 来遍历目录中的文件。我让这段代码在一夜之间运行,它(经过多次调整)在某个时候崩溃了。我试图弄清楚这发生在什么时候(是的,我的日志记录很糟糕)。现在,根据this javadoc 列出文件时不能保证顺序(字母或其他),我想知道是否有任何一致性保证?这意味着当我两次运行相同的代码时,我会得到完全相同的文件顺序吗?逻辑告诉我应该这样做,我已经基于此恢复了操作,但我对此表示怀疑。另外,我很好奇 javadoc 中的“没有特定顺序意味着什么”。

【问题讨论】:

  • 如果你想保证订单,为什么不使用Comparator
  • 应用程序运行时文件可能会发生变化......因此每次运行时可能会有所不同。该顺序很可能取决于文件系统实现。答案很可能是“是的,有一致性”,就好像你在命令行上执行“ls”或“dir”会给你一致性,但不能保证按字母排序。
  • 啊,是的,我会(现在),但这是为了恢复失败的运行,我不想重复处理过的文件。
  • @ricosrealm ls 通过提供默认排序顺序让生活变得轻松。对于我的用例,这是一个只读目录,文件不会改变

标签: java


【解决方案1】:

鉴于您正在查看的文件在两次调用之间不会发生变化,并且您在完全相同的平台上运行它们两次,我认为您会得到相同的结果。

【讨论】:

  • 这也是我的希望 - 只是想知道是否有这样的文件可以让我放心
  • 这里基本上不要依赖一致性。我喜欢迈克的回答。
  • 这很重要,我会再次运行程序,但先整理文件并执行一些日志
【解决方案2】:

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

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

如果你想要一个一致的顺序,你可以这样做

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

【讨论】:

  • 这令人担忧。和我所期望的一样。它让我无法知道哪些文件已处理,哪些未处理。有了可怕的日志记录。这种排序是有道理的,但如果我想重新开始整个事情,那将很有用。不过谢谢!
  • 可能值得研究一下 java 7 的新 WatchService API。 stackoverflow.com/questions/494869/…
【解决方案3】:

没有顺序的保证,但是 AFAIK 没有“不一致的保证”,所以调用它两次,考虑到没有以任何方式更改或触及文件,可能会给你相同的顺序。但是,如果你正在“处理”它们,它们可能已经被触动了。

不过,为了保持理智,如果您要依赖一致性,我建议您在获得它们时对它们进行排序。

【讨论】:

  • :) 我应该更清楚 - 我正在阅读它们,而不是编辑它们。因此,目录结构和其中的文件不会改变。也就是说,正如 Mike Samuel 指出的那样,文件系统可能会在订单中发挥作用,这意味着我可能不会得到完全相同的订单。
  • 您可以随时尝试测试订单是否保留。这是确定它是否足够稳定以便您从停止的地方继续运行的最简单方法。
  • 我做到了,而且似乎没问题。但这就是导致问题的原因,想知道这是否总是正确/这一次只是幸运
【解决方案4】:

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

【讨论】:

    猜你喜欢
    • 2010-12-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-11-02
    • 2013-02-28
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多