Java 在排序文件时,比较方法违反了其总约定

Java 在排序文件时,比较方法违反了其总约定,java,file,sorting,comparator,Java,File,Sorting,Comparator,我知道有很多关于这种异常的问题,我确实找到了解决方案,但我的问题是不同项目中的相同代码不会引发异常,而这个项目会引发异常。这两个项目都有相同版本的Java和其他库 基本上我有一个小函数,它从目录中检索文件列表,按时间戳排序,然后返回绝对文件名列表: public static List<String> getFiles(String dir) { List<String> fileList = new ArrayList<String>();

我知道有很多关于这种异常的问题,我确实找到了解决方案,但我的问题是不同项目中的相同代码不会引发异常,而这个项目会引发异常。这两个项目都有相同版本的Java和其他库

基本上我有一个小函数,它从目录中检索文件列表,按时间戳排序,然后返回绝对文件名列表:

public static List<String> getFiles(String dir) {

    List<String> fileList = new ArrayList<String>();
    File[] files = new File(dir).listFiles();

    // Sort files by the date of their creation (last modification)
    Arrays.sort(files, LastModifiedFileComparator.LASTMODIFIED_COMPARATOR);

    for (File f : files) {
        fileList.add(f.getAbsolutePath());
    }
    return fileList;

}
现在,存在多线程问题,因此让我解释一下我的代码的作用:我有一个任务调度器,它以固定延迟调用方法
getFiles(String)
,然后处理每个文件:

private Thread handleFiles () {
    return new Thread() {
        public void run() {

            List<String> files = getFiles("/home/user/files/");
            if (files.isEmpty()) {
                return;
            }

            for (String file : files) {
                try {
                    // handle file...
                } catch (Exception e) {
                    // log error...
                } finally {
                    // delete file...
                }

            }

        }
    };
}
基本上这是我的两个项目处理文件的方式我的问题是:为什么第一个
getFiles(String)
方法在一个项目中有效,而在另一个项目中无效?如果他们使用不同版本的Java或其他库(如ApacheCommonsIO),我会理解,但他们使用相同的版本

编辑#1:FileLastModifierPair.java:

public class FileLastModifiedPair implements Comparable<FileLastModifiedPair> {
    public File f;
    public long t;

    public FileLastModifiedPair(File file) {
        f = file;
        t = file.lastModified();
    }

    public int compareTo(FileLastModifiedPair that) {
        long result = this.t - that.t;

        if (result < 0) {
            return -1;
        } else if (result > 0) {
            return 1;
        } else {
            return 0;
        }
    }
}
公共类FileLastModifiedPair实现可比较{
公共文件f;
公共长t;
公共文件LastModifiedPair(文件){
f=文件;
t=file.lastModified();
}
public int compareTo(FileLastModifiedPair){
长结果=这个.t-那个.t;
如果(结果<0){
返回-1;
}否则,如果(结果>0){
返回1;
}否则{
返回0;
}
}
}

在某种情况下,排序过程中某些文件的文件修改时间可能会发生变化,因此排序位置也会发生变化。有一天,这也可能发生在另一个项目中。通过缓存这些时间来创建目录快照的方法在我看来是正确的。

我猜在一个项目中,一些文件在排序时会被修改。这肯定会弄乱排序算法,并解释您得到的错误。另请参见

Show us
LastModifiedFileComparator
class code.@Codebender这就是我不会在我的应用程序内外更改文件(至少,在所有文件排序后,我才开始处理和删除它们)。排序算法是否会更改File.lastModified字段?
    Date startOfTomorrow = DateTime.now()
            .withTimeAtStartOfDay()
            .plusDays(1)
            .toDate();

    scheduler.scheduleWithFixedDelay(
            handleFiles(),
            startOfTomorrow,
            DELAY_IN_MILLIS);
public class FileLastModifiedPair implements Comparable<FileLastModifiedPair> {
    public File f;
    public long t;

    public FileLastModifiedPair(File file) {
        f = file;
        t = file.lastModified();
    }

    public int compareTo(FileLastModifiedPair that) {
        long result = this.t - that.t;

        if (result < 0) {
            return -1;
        } else if (result > 0) {
            return 1;
        } else {
            return 0;
        }
    }
}