2012-08-03 95 views
3

作为处理的结果,某些数据文件被写入磁盘。文件2个服务器(MAC和Linux)匹配 .listFiles()可以在不同系统上以不同顺序返回文件

  • 文件名之间

    • 计数是系统之间相同
    • 文件内容是系统之间相同的,如通过的md5sum测量

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

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

    .listFiles() javadoc说:

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

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

    这是否意味着当文件在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 ;) 
    } 
    
    5

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

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

    2

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

    如果您的程序依赖于某些特定顺序的文件,最好的方法是获取文件名列表,然后按照您的喜好对其进行排序,然后打开文件。这样,你就不依赖于本地的实现细节。

    0
    public class File implements Serializable, Comparable<File> 
    

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

    阅读Java 7的发布说明,您将看到许多“未保证”更改的情况以及“非公共”API被删除或更改的其他地方。如果文件说你不能依靠它,你不能依赖它。它可以在任何主要或次要版本中更改。

    相关问题