jav*_*dev 5 java java-7 watchservice java-threads
我有一个模块,必须检查特定目录的新文件(Create).该文件将由另一个我无法控制或可见的系统创建.
我使用了Java WatchService API,当创建新文件时,我能够获得事件ENTRY_CREATE.下面是代码.
WatchService watchService = FileSystems.getDefault().newWatchService();
Path path = Paths.get(dirLocation);
path.register(watchService, StandardWatchEventKinds.ENTRY_CREATE, StandardWatchEventKinds.ENTRY_MODIFY,
StandardWatchEventKinds.ENTRY_DELETE);
WatchKey key;
while ((key = watchService.take()) != null) {
for (WatchEvent<?> event : key.pollEvents()) {
if ("ENTRY_CREATE".equalsIgnoreCase(event.kind().name())) {
// File reading here
}
Run Code Online (Sandbox Code Playgroud)
问题是在尝试读取新文件的某个时候,我正在获取空内容而没有任何异常.搜索Google和SO,我发现如果文件写入不完整,可能会发生这种情况.为了解决这个问题,我尝试了随机访问文件,锁定并创建了FileOutputStream,但没有运气,我得到了空的内容,没有任何例外.最后我尝试了下面的工作.但我担心的是,这必须在单独的线程内部进行检查,以便不阻塞WatchService事件,并且线程数量可以随着文件数量的增长而增长,也可能是更昂贵的操作.
closed = file.renameTo(file);
Run Code Online (Sandbox Code Playgroud)
有没有其他有效的方法来检查文件写入操作是否完成?或者是否有任何API可以处理这个?