Подтвердить что ты не робот

Отменить блокировку файлов Java в Windows

У меня возникли проблемы с удалением файла в Windows с помощью java. По какой-то причине java сохраняет блокировку моего файла, и я не знаю, почему. Вот мой код:

private byte[] getFileByteArray(File file) {
    try {
        RandomAccessFile raf = new RandomAccessFile(file, "r");
        FileChannel channel = raf.getChannel();
        try {

            ByteBuffer buffer = channel.map(FileChannel.MapMode.READ_ONLY, 0, channel.size());
            byte[] bt = new byte[buffer.remaining()];
            buffer.get(bt);
            channel.close();
            raf.close();
            file.delete();
            return bt;

        } catch (Exception ex) {
            //Logger.getLogger(ConnectionImpl.class.getName()).log(Level.SEVERE, null, ex);
            System.out.println(ex.toString());
        }

    } catch (FileNotFoundException ex) {
        Logger.getLogger(ConnectionImpl.class.getName()).log(Level.SEVERE, null, ex);
    }
    return null;
}

file.delete(), а также попытка вручную в проводнике Explorer отказывается удалить файл, поскольку он все еще используется. В Linux все выглядит хорошо.

Мне не хватает close() где-то? Я могу подтвердить, что метод, который делает файл в первую очередь, закрывает файл, так как я могу удалить файл перед запуском вышеуказанного кода, используя file.delete()

Дополнительная информация:. Вышеприведенный код является частью метода getFileByteArray (Файл файла) и вызывается вот так:

public byte[] createReport(int id) {

    Report report = new Report();
    String filename = report.CreateReport(id);
    return getFileByteArray(new File(filename));
}

Спасибо

Обновление: Мне удалось исправить эту проблему, прочитав файл килобайт на килобайт в байтовый массив, используя ByteArrayOutputStream

В качестве плаката, упомянутого ниже, в Java существует известная ошибка, поскольку в Windows возникают проблемы с сопоставлением файлов.

4b9b3361

Ответ 1

Это известная ошибка в Java на Windows, см. Ошибка # 4715154

Sun оценила проблему и закрыла ошибку со следующим объяснением:

Мы не можем это исправить. Windows не позволяет удалять сопоставленный файл. Эта проблему следует немного смягчить, как только мы исправим сборщиков мусора освободите прямые буферы более быстро (см. 4469299), но в противном случае мы ничего не можем с этим поделать.

Ответ 2

Добавление в mhaller ответ

И перевод sarumont комментария в код

Этот должен/может работать.

private static void deleteMappedFilesIfExists(Path path) throws IOException {
    while (true) {
        try {
            Files.deleteIfExists(path);
            break;
        } catch (AccessDeniedException e) {
            System.gc();
        }
        //Add delay if needed.
    }
}