2

我正在使用 aWatchService来检查是否将文件添加到目录中。然后,侦听器以包装在自定义类中的 ByteBuffer 的形式从文件中获取输入流(见下文)。

问题是,尽管调用close()了每个相关对象(以及更多对象),并检查文件是否未锁定File.canWrite()(返回 true),但当我尝试移动文件时,Windows 仍然抱怨文件被 JVM 锁定.

我已经搜索了任何可能锁定文件的代码,但是由于canWrite()返回 true,我不确定我还能做什么。有没有人有任何想法?

自定义类的骨架如下。我意识到这可能不是最好的实现,但我也不知道它是否会导致问题。

private static class ByteBufferBackedInputStream extends InputStream {

    private final ByteBuffer  buf;
    private final FileChannel channel;

    public ByteBufferBackedInputStream(FileInputStream fs) throws IOException {

        this.channel = fs.getChannel();
        this.buf = channel.map(FileChannel.MapMode.READ_ONLY, 0, channel.size());

        fs.close();
    }

    //... all required methods implemented, including close() method

}

任何帮助将非常感激。

编辑从第一条评论开始,我正在使用buf.close(),这没有帮助。我还逐步完成了整个过程,并且没有抛出异常 - 只是为了确保我使用的是finally块。

我有一种感觉,这可能是为了实现我的实现,WatchService但它没有明确使用任何 IO 方法,只是一个生产者和消费者LinkedBlockingQueue

编辑 2正如 Andreas 在下面的评论中建议的那样,使用标准的 read()/write() 操作有效并且文件没有被锁定。最终,缓冲区的使用是遗留代码(可能是为了在处理潜在的大文件时进行优化),因此现在可以安全地更改。

尽管如此,这个问题在技术上仍然没有得到解答,所以我暂时将其保留。谢谢您的帮助 :)

4

0 回答 0