Phi*_*ppe 5 java filesystems nio watch
对于一个媒体库,我想在文件系统中的条目发生更改时更新条目,我想通过使用此示例来尝试“新”java.nio文件观看功能。
我期望在创建、移动(重命名)或删除文件时获得有用的事件,但在 windows7 上观看文件夹时发生的情况如下(尚未尝试其他操作系统):
格式:
[ThreadName] DEBUG 2012-04-09 18:20:35.934 GroupNumber-COMMAND:路径
ThreadName:每个监视文件夹在其自己的线程中运行,具有不同的 id
GroupNumber:使用相同 GroupNumber 发送的消息同时发送(通常..)
COMMAND:接收到的命令
Path:接收到的路径
Rename:
[Watch0] DEBUG 2012-04-09 18:20:35.934 2-ENTRY_DELETE: C:\tmp\tmp\test.avi
[Watch0] DEBUG 2012-04-09 18:20:35.935 2-ENTRY_CREATE: C:\tmp\tmp\test1.avi
[Watch0] DEBUG 2012-04-09 18:20:35.936 3-ENTRY_MODIFY: C:\tmp\tmp
[Watch0] DEBUG 2012-04-09 18:20:35.937 4-ENTRY_MODIFY: C:\tmp\tmp\test1.avi
[Watch4] DEBUG 2012-04-09 18:43:47.965 18-ENTRY_DELETE: F:\tmp\test.avi
[Watch4] DEBUG 2012-04-09 18:43:47.966 18-ENTRY_CREATE: F:\tmp\test1.avi
[Watch4] DEBUG 2012-04-09 18:43:47.967 19-ENTRY_MODIFY: F:\tmp\test1.avi
Create:
[Watch0] DEBUG 2012-04-09 18:22:02.055 5-ENTRY_CREATE: C:\tmp\test.avi
[Watch0] DEBUG 2012-04-09 18:22:02.066 6-ENTRY_MODIFY: C:\tmp\test.avi
[Watch0] DEBUG 2012-04-09 18:22:03.460 7-ENTRY_MODIFY: C:\tmp\test.avi
//Note the 1.4'' delay between the last two messages.
//This is the time required to actually copy the file
Move in same watch folder:
[Watch0] DEBUG 2012-04-09 18:18:42.395 0-ENTRY_DELETE: C:\tmp\test.avi
[Watch0] DEBUG 2012-04-09 18:18:42.396 0-ENTRY_MODIFY: C:\tmp\tmp
[Watch0] DEBUG 2012-04-09 18:18:42.396 1-ENTRY_CREATE: C:\tmp\tmp\test.avi
[Watch0] DEBUG 2012-04-09 18:18:42.396 1-ENTRY_MODIFY: C:\tmp\tmp\test.avi
Move to other watch folder on same drive:
[Watch1] DEBUG 2012-04-09 18:23:24.341 8-ENTRY_CREATE: C:\tmp2\test.avi
[Watch0] DEBUG 2012-04-09 18:23:24.341 8-ENTRY_DELETE: C:\tmp\test.avi
[Watch1] DEBUG 2012-04-09 18:23:24.342 10-ENTRY_MODIFY: C:\tmp2\test.avi
//The two 8 are lying. Both messages are being sent from different threads
//and the shared counter hasn't been incremented by any yet. The next entry has been
//incremented by two!
Move to other watch folder on different drive:
[Watch4] DEBUG 2012-04-09 18:25:42.324 11-ENTRY_CREATE: F:\tmp\test.avi
[Watch4] DEBUG 2012-04-09 18:25:42.338 12-ENTRY_MODIFY: F:\tmp\test.avi
[Watch4] DEBUG 2012-04-09 18:25:42.703 13-ENTRY_MODIFY: F:\tmp\test.avi
[Watch3] DEBUG 2012-04-09 18:25:49.433 14-ENTRY_DELETE: C:\tmp2\test.avi
//Note that the last delete message is being sent from another thread then the first ones.
//This is because the source and destination WatchDirs aren't the same
Delete:
[Watch9] DEBUG 2012-04-05 21:22:02.921 ENTRY_DELETE: C:\tmp\test (2011).mkv
Run Code Online (Sandbox Code Playgroud)
不是单个事件,而是一组必须解释的“命令+路径”。例如,删除由单个命令组成,而重命名和“移动到同一文件夹中”也以删除命令开头,但将由其未来的命令定义。另外,多个文件可以例如并行移动,这将最终出现在属于不同操作的命令的随机列表中,必须以某种方式进行排序。
我能想到的最好的方法是这个类,其中事件在被接收时被排队,然后在另一个线程中接收后检查片刻(1s)(如果正在生成其他事件并且属于同一线程,则给予一些时间) '事件组')。
如果重命名、移动、创建或删除单个文件,这会起作用,但如果开始并行复制多个文件或复制一批文件,则任何操作都不起作用。
是否已经存在我需要的任何实现(似乎是一个常见的用例)?或者有人有一个好主意如何解决这个问题以涵盖所有情况?
最后,它必须适用于 windows、linux 和 osx。
也应该支持一个更复杂的示例
[Watch0] DEBUG 2012-04-09 19:10:17.774 0-ENTRY_CREATE: C:\tmp\tmp\testlarge.avi
[Watch0] DEBUG 2012-04-09 19:10:17.825 0-ENTRY_MODIFY: C:\tmp\tmp\testlarge.avi
[Watch0] DEBUG 2012-04-09 19:10:17.826 1-ENTRY_MODIFY: C:\tmp\tmp
[Watch0] DEBUG 2012-04-09 19:12:09.516 2-ENTRY_DELETE: C:\tmp\tmp\testsmall.avi
[Watch0] DEBUG 2012-04-09 19:12:09.516 3-ENTRY_CREATE: C:\tmp\testsmall.avi
[Watch0] DEBUG 2012-04-09 19:12:09.517 3-ENTRY_MODIFY: C:\tmp\testsmall.avi
[Watch0] DEBUG 2012-04-09 19:12:09.521 4-ENTRY_MODIFY: C:\tmp\tmp
[Watch0] DEBUG 2012-04-09 19:14:13.025 5-ENTRY_MODIFY: C:\tmp\tmp\testlarge.avi
Run Code Online (Sandbox Code Playgroud)
此处,在创建大文件的同时正在移动小文件。
对java nio文件观察器不是很熟悉,但是我使用jnotify库从文件系统获取事件,它非常好并且可以在Windows和Linux上使用。
如果你想以任何方式使用 nio 尝试看看这里: https: //blogs.oracle.com/thejavatutorials/entry/watching_a_directory_for_changes
| 归档时间: |
|
| 查看次数: |
2760 次 |
| 最近记录: |