我正在使用比较器按修改日期对文件进行排序。这些文件将被处理以包含数据并在之后删除。在处理文件之前,我必须确保文件按顺序排列。以下是我到目前为止的情况。
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);
}
}
有没有标准方法来处理这样的情况?
答案 0 :(得分:4)
我认为解决这种特殊情况的方法是在每条路径上调用Files.getLastModifiedTime()
一次,存储结果,然后在排序过程中使用存储的结果。
这有几个好处:
它干净地解决了IOException
问题。
对于相同的文件,它不会重复且不必要地执行相同的代价高昂的I / O操作。
即使文件的最后修改时间在排序中间发生变化,也可以确保一致的排序(例如,请参阅"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对象进行排序。