首页 > 解决方案 > 使用 Java 从目录中读取当前文件和新文件

问题描述

我编写了一个程序来处理目录中的文件。在启动时,它会读取目录中的当前文件,然后使用监视器来发现新文件。一旦它处理了一个文件,程序就会删除该文件。问题是在启动时读取目录中的文件和启动侦听器之间存在时间间隔,无论多么微小。在该间隙中创建的文件将丢失。一种可能的解决方案是重复读取目录 (newDirectoryStream) 中的文件,但这似乎不如使用监视器那么优雅或高效。该代码使用 Apache Commons 监视器,看起来像:

// Read Current files
stream = Files.newDirectoryStream(listenDir);
processFile(file);

// Process New files
FileAlterationObserver observer = new 
     FileAlterationObserver(listenDir.toAbsolutePath().toString(),filter);

    
FileAlterationMonitor monitor = new FileAlterationMonitor(POLL_INTERVAL);
FileAlterationListener listener = new FileAlterationListenerAdaptor() {
    @Override
    public void onFileCreate(File file) {
        processFile( file.toPath());
    } 
};
        
observer.addListener(listener);
monitor.addObserver(observer);
monitor.start();
        

标签: javafile-io

解决方案


简单翻转一下:先设置监听器,然后获取目录流。浏览一个并发集合,它允许您执行“仅一次”布局(将文件名添加到集合并获得返回值的那个,表明“您实际上是添加它的那个,您不仅仅是重新-应用已经存在的东西' - 然后你处理文件,否则你继续)。这样,如果文件被添加到“最佳位置”,目录流和观察者都会得到它,但仍然只有一个会处理它。


推荐阅读