java.io.IOException: не удалось удалить оригинальный файл moveFileToDirectory

Я пытаюсь переместить следующие файлы в операторе if с помощью FileUtils.moveFileToDirectory после того, как файлы были преобразованы. Файлы JPG и gif перемещаются в новую папку, но всякий раз, когда программа находит файл ICO, она не перемещает этот файл в новую папку и выдает меду StackTrace: java.io.IOException: Не удалось удалить исходный файл - исходный путь файла "после копирования в" новый путь к файлу ". Вот код для метода:

public void storeOriginalImages() {
    for(File file: model.getFileList()) {
        if(file.getName().endsWith(".GIF") || file.getName().endsWith(".gif") || file.getName().endsWith(".JPG") 
                || file.getName().endsWith(".jpg")  || file.getName().endsWith(".ico") || file.getName().endsWith(".ICO")
                || file.getName().endsWith(".BMP") || file.getName().endsWith(".bmp")) {
            System.out.println("in copy else");
            File illegalExtension = new File(file.getAbsolutePath());
            File illegalExtensionDest = new File(model.getTargetexcelFilepath() + "/" + model.getFolderName() + "_img_backup");
            System.out.println(illegalExtension + "/" + illegalExtensionDest);

            try {
                FileUtils.moveFileToDirectory(illegalExtension, illegalExtensionDest, true);
            } catch (IOException e) {
                e.printStackTrace();
            }
        }
    }

}

Вот как файл ICO преобразуется в png:

else if(s.getName().endsWith(".ico") || s.getName().endsWith(".ICO")) {
            List<BufferedImage> bi = ICODecoder.read(new File(s.getAbsolutePath()));
            System.out.println("reading");
            ImageIO.write(bi.get(0), "png", new File(s.getParentFile().getAbsoluteFile(), fileNameWithOutExt + ".png"));
            System.out.println("Ico was converted.");
        }

1 ответ

Решение

Я взял ваш пример и немного отредактировал. Кажется, когда ICODecoder пытается прочитать из файла, используя поток, он не закрыл его должным образом, поэтому вам нужно закрыть его в своем коде. Вот рабочий пример

File oldFile = new File("a.ico");
try (InputStream inputStream = new FileInputStream(oldFile)) {
     List<BufferedImage> bi = ICODecoder.read(inputStream);
     ImageIO.write(bi.get(0), "png", new File("a" + ".png"));

} catch (IOException e) {
    LOG.error("Something happend", e);
}
FileUtils.moveFile(oldFile, new File("a.jpg"));

Вам необходимо закрыть входной поток перед перемещением файла.

Другие вопросы по тегам