当前位置: 首页 > 面试题库 >

在Windows中释放Java文件锁定

宓毅庵
2023-03-14
问题内容

我在使用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),就应该在某种程度上缓解此问题,但是除此之外,我们无能为力。



 类似资料:
  • SQLite具有不同级别的锁:、、、、。 我找不到调用SQLite API获取和释放锁定的信息。 据我所知,调用sqlite3\U步骤时获得锁。锁的类型取决于预处理语句的表达式。此外,此命令还可以升级自定义事务内的锁定写入操作。 据我所知,写入锁也是由sqlite3\u步骤释放的-此函数返回SQLITE\u DONE或错误代码。我没有找到任何文档,但该函数应该在执行结束时释放保留的待处理的独占的。

  • 我的问题类似于这个问题MySQL在连接丢失/断开的情况下回滚事务,但那是5年前的事了。 如果一个客户端(比如jdbc或其他什么)锁定了表中的一行,执行一些语句,那么网络就关闭了,所以mysql永远不会从客户端收到或命令,mysql是否支持自动回滚这个事务(解锁行)? 我引用它说,但是有多长时间以及在哪里设置它? 在类似的问题中,公认的答案是使用,如果设置为10秒这样的小数字,那么池中的空闲连接(如

  • 问题内容: UNIX文件锁定非常简单:操作系统假定您知道自己在做什么,然后就可以按照自己的意愿进行操作: 例如,如果您尝试删除另一个进程已打开的文件,则操作系统通常会允许您执行此操作。原始进程仍将保留其文件句柄,直到它终止-这时文件系统将安静地回收磁盘资源。不用大惊小怪,这就是我喜欢的方式。 Windows上的不同之处:如果我尝试删除另一个进程正在使用的文件,则会出现操作系统错误。在原始进程释放它

  • 问题内容: 我有几个线程(其中一些由进程X产生,其他由进程Y 等产生 ),并且每个线程都需要写入文件。但是,如果开始写第一,那么,当开始写作,它需要等待到 释放文件 ,以便它可以读取写在该内容。换句话说,每个线程都会有一个方法,如下所示: 我的问题是:如何完成以上代码?我正在研究该类,但是它在Javadoc中说: “文件锁代表整个Java虚拟机持有。它们不适合控制同一虚拟机中多个线程对文件的访问。

  • 我如何使DIA释放它对pdb文件的锁? 我加载一个pdb并创建一个会话,如下所示,所有工作都很好,我可以使用会话从pdb获取数据。 斯图尔特。

  • 问题内容: 我需要锁定一个文件才能用Python编写。将同时从多个Python进程访问它。我在网上找到了一些解决方案,但大多数解决方案出于我的目的而失败,因为它们通常仅基于Unix或Windows。 问题答案: 好了,所以我最后讲了我在这里编写的代码,在我的网站上的链接已失效,在上查看(也可以在GitHub上查看)。我可以按以下方式使用它: