У меня есть код, который удаляет все файлы в каталоге, за исключением последних n последних измененных. Код получает список объектов File
из каталога, сортирует их с помощью компаратора, который смотрит на File.lastModifedTime()
, а затем удаляет соответствующий подсписчик.
Когда мы перешли на Java 7, программа начала метать java.lang.IllegalArgumentException: Comparison method violates its general contract!
. Я подозреваю, что это связано с тем, что файл изменен (нормальное поведение) до того, как сортировка завершена, поэтому компаратор возвращает несогласованные значения, проверяя каждый последний измененный файл.
Мой вопрос: как бы вы решили эту проблему и удалили нужные файлы?
Одно из предложений, которое я прочитал, состояло в том, чтобы сохранить файл и его последнее модифицированное время на карте перед сортировкой, поэтому при выполнении сравнений последнее измененное время просматривается с карты. Однако, если файл изменил среднюю сортировку, карта не обновляется, так что вы не удалили бы неправильный файл?
Другая идея, о которой я думал, - это использовать файл Java NIO для просмотра отсортированного списка и повторной сортировки всякий раз, когда изменяется файл. Но это кажется довольно сложным.
Я также подумал о методе грубой силы обертывания сортировки в заявлении try-catch и просто повторить весь класс, если он столкнулся с нарушением метода сравнения.
Наконец, я мог бы просто установить свойство java.util.Arrays.useLegacyMergeSort
и вернуться к тихому игнорированию способов Java 6.