在比较器中处理IOException的正确方法是什么?

时间:2016-12-13 18:21:08

标签: java

我正在使用比较器按修改日期对文件进行排序。这些文件将被处理以包含数据并在之后删除。在处理文件之前,我必须确保文件按顺序排列。以下是我到目前为止的情况。

public class FileComparator implements Comparator<Path> {  
    @Override
    public int compare(Path o1, Path o2) {
        try {
            return Files.getLastModifiedTime(o1).compareTo(Files.getLastModifiedTime(o2));
        } catch (IOException exception) {
            //write to error log
            //***
        }
    }
}

***这就是我被困住的地方。我必须返回一个int,因为compare需要它但我不想返回零并且在失败时具有错误的等价。

我尝试重构代码但是如果getLastModifiedTime()失败,o1Modified和o2Modified将为null。

public class FileComparator implements Comparator<Path> {  
    @Override
    public int compare(Path o1, Path o2) {
        FileTime o1Modified = null;
        FileTime o2Modified = null;        
        try {
            o1Modified = Files.getLastModifiedTime(o1);
            o2Modified = Files.getLastModifiedTime(o2);
        } catch (IOException exception) {
            //write to error log

        }

        return o1Modified.compareTo(o2Modified);

    }
}

有没有标准方法来处理这样的情况?

2 个答案:

答案 0 :(得分:4)

我认为解决这种特殊情况的方法是在每条路径上调用Files.getLastModifiedTime()一次,存储结果,然后在排序过程中使用存储的结果。

这有几个好处:

  1. 它干净地解决了IOException问题。

  2. 对于相同的文件,它不会重复且不必要地执行相同的代价高昂的I / O操作。

  3. 即使文件的最后修改时间在排序中间发生变化,也可以确保一致的排序(例如,请参阅"Comparison method violates its general contract!",了解这可能会巧妙地破坏您的代码)。

    < / LI>

答案 1 :(得分:2)

抛出包装IOException的运行时异常:

    try {
        return Files.getLastModifiedTime(o1).compareTo(Files.getLastModifiedTime(o2));
    } catch (IOException e) {
        throw new UncheckedIOException("impossible to get last modified dates, so can't compare", e)
    }

但请注意,修改时间可能会在排序期间发生变化,这会使您的比较器不正确:它不再尊重合同。因此,更好的方法是首先遍历您的路径,并将它们包装到一些TimedPath对象中,该对象将存储最后的修改时间,然后对这些TimedPath对象进行排序。