我正在使用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。 最终,缓冲区的使用是遗留代码(可能在处理潜在的大文件时进行优化),因此现在可以安全地进行更改。
无论如何,这个问题在技术上还是没有答案,所以我现在就把它打开。 谢谢您的帮助 :)