在Windows Vista上使用Java,我正在尝试为目录创建一种监视器,因此每次修改此目录(新的,重命名的,更新的或删除的文件)时都会触发一个进程。我尝试使用一个循环来执行此操作,该循环将在目录中执行dir
并分析所有文件。但这是时间和内存消耗,特别是当文件数量开始增长时。我认为应该有更好的方法来做到这一点。
注意:SO中有一个similar question,但它适用于C#。
答案 0 :(得分:4)
我认为应该有更好的方法 这样做。
你是对的,应该有一种更好的方法,它应该是Java 7.请参阅即将发布的WatchService API。
如果没有获得RC构建,我不知道是否有可行的方式来执行您所描述的内容。
答案 1 :(得分:3)
如果您不能等待Java 7和WatchService,则必须执行以下操作:
final File watched = new File("[path of directory to watch]");
long lastModified = watched.lastModified();
while(true) {
if (watched.lastModified() > lastModified) {
// Change happened in the directory do what you want.
}
Thread.sleep(2000); // 2 second interval
}
答案 2 :(得分:1)
你到底在监视什么?我希望您只需要监视目录的修改时间,然后检查文件的修改时间(如果目录已被修改)。
所以我希望存储Map
个文件名与修改时间(至少用于检查)。
不幸的是,没有一个 easy 意味着使用Java来检查目录中的更改,而不是以某种身份轮询目录。见a previous answer of mine wrt。这个问题和库可以用来简化这个(加上Java 7特性)
答案 3 :(得分:1)
您可能需要使用JNI来调用ReadDirectoryChangesW。您可以使用FirstFirstChangeNotification和FindNextChangeNotification,但除非您需要与旧的(16位)Windows版本兼容,否则我建议不要使用它。