我正在使用 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() 操作有效并且文件没有被锁定。最终,缓冲区的使用是遗留代码(可能是为了在处理潜在的大文件时进行优化),因此现在可以安全地更改。
尽管如此,这个问题在技术上仍然没有得到解答,所以我暂时将其保留。谢谢您的帮助 :)