Проблема с дефолтным методом File.delete()
Делаю небольшой проект - база данных резюме с разными реализациями хранилищ. Проблема возникла при реализации хранилищ через File с сохранением и чтением из файла. Проходит 1 тест, а дальше программа падает с исключением при удалении файла. При этом мой метод delete() реализован через дефолтный File.delete(). Он же используется при очистке всего хранилища с резюме. Вот эти методы:
@Override
protected void deleteResume(File file) {
if (!file.delete()) {
throw new StorageException("File delete error", file.getName());
}
}
@Override
protected void clearStorage() {
for (File file : Objects.requireNonNull(directory.listFiles())) {
deleteResume(file);
}
}
Здесь весь проект с тестами: https://github.com/JavaSash/baseJava
Вкратце что там происходит:
Общий класс с основными методами находится в параметризованном
AbstractStorage<SK>, от него наследуется частная реализация сохранения резюме в файл и чтение из файла -FileStorage extends AbstractStorage<File>. Он реализован через паттерн стратегия. В него передаём директорию типаFileи, собственно, файл стратегииStrategySwitcher switcher(класс находится в пакетеStrategy).В классе FileStorage и находятся методы
deleteResume()иclearStorage(), который внутри используетdeleteResume(). deleteResume() использует дефолтный метод класса File, который возвращает boolean и если файл не удалён, то бросает исключение.В тестах структура аналогичная: родительский абстрактный класс
AbstractStorageTestс тестами, в который через конструктор иsuper()передаём объект нужного нам хранилища (FileStorage).public FileStorageTest() throws IllegalAccessException { super(new FileStorage(STORAGE_DIR, new StrategySwitcher())); }Перед каждым тестом делаем setup: чистим хранилище резюме (через
clearStorage()и сохраняем 3 резюме). При запуске тестов проходит updateNotExist:
И на следующем тесте delete падает:

Дебагом упёрся в то, что почему-то не проходит метод с вызовом дефолтного File.delete().
Метод clearStorage() удаляет все файлы в пакете, кроме файлов резюме. Значит возможно проблема ещё при записи может быть. Первый тест проходит возможно потому, что при сетапе чистим пустое хранилище.
В чём может быть проблема?
Ответы (1 шт):
Для того, чтобы вызов file.delete() вернул true, необходимо, чтобы файл существовал, а если это директория, чтобы она была не пустая, об этом сказано в документации.
Попробуйте удалить файл с помощью Files.delete(file.toPath()) (из пакета java.nio), вы получите более конкретную ошибку.