java - 使用 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();
解决方案
简单翻转一下:先设置监听器,然后获取目录流。浏览一个并发集合,它允许您执行“仅一次”布局(将文件名添加到集合并获得返回值的那个,表明“您实际上是添加它的那个,您不仅仅是重新-应用已经存在的东西' - 然后你处理文件,否则你继续)。这样,如果文件被添加到“最佳位置”,目录流和观察者都会得到它,但仍然只有一个会处理它。
推荐阅读
- python-3.x - 在 Python3.7.1 中使用 cv2.imread 从 Opencv3 读取 png 图像,黑色窗口根本没有像素
- php - 我正在检查一个表的行的值,并尝试将该表的另一个值导入另一个表
- r - QAP分析如何保证行名和列名顺序一致
- python - 如何纠正 IndexError
- c++ - C++中的概念多态性
- python - 在 Python 中用图片训练 SVM
- c# - 如何在不创建新数组的情况下更改数组中元素的数量
- android - 作为系统应用程序运行时,Android 不允许执行本机库
- c++ - 错误:无法将“float”转换为“float*”作为参数
- angularjs - 角度 1.x 是否仍然相关