Java File.canWrite()返回true并调用所有close()方法后,文件在Windows中保持locking状态

我正在使用WatchService来检查将文件添加到目录。 一个监听器然后从自定义类中包装的ByteBufferforms的文件中获取inputstream(见下文)。

问题是,尽pipe在每个相关对象(还有一些close()上调用close() ,并检查文件没有被File.canWrite()locking(返回true),Windows仍然抱怨文件被锁JVM当我尝试移动它。

我已经canWrite()了任何可能locking文件的代码,但由于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() ,这不是帮助。 我也经历了整个过程,并没有抛出exception – 只是为了确保我finally使用了块。

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

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

无论如何,这个问题在技术上还是没有答案,所以我现在就把它打开。 谢谢您的帮助 :)