簡體   English   中英

在 Windows 中釋放 Java 文件鎖

[英]Release Java file lock in Windows

我在用 java 刪除 Windows 中的文件時遇到了一些問題。 出於某種原因,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() 以及在資源管理器中手動嘗試拒絕刪除該文件,因為它仍在使用中。 不過在 Linux 中一切似乎都很好。

我在某處錯過了 close() 嗎? 我可以確認首先創建文件的方法是關閉文件,因為我可以在使用 file.delete() 運行上述代碼之前刪除文件

額外信息:上面的代碼是名為 getFileByteArray(File file) 的方法的一部分,它的調用方式如下:

public byte[] createReport(int id) {

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

謝謝

更新:我設法通過使用 ByteArrayOutputStream 將文件千字節讀入字節數組來解決該問題

正如下面提到的海報,Java 中存在一個已知錯誤,即 Windows 存在文件映射問題。

這是 Windows 上 Java 中的一個已知錯誤,請參閱錯誤 #4715154

Sun 評估了問題並關閉了錯誤,解釋如下:

我們無法解決這個問題。 Windows 不允許刪除映射文件。 一旦我們修復垃圾收集器以更迅速地釋放直接緩沖區(參見 4469299),這個問題應該會有所改善,否則我們對此無能為力。

添加到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.
    }
}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM