Regarder un Répertoire pour les Modifications en Java
Je veux regarder un répertoire pour les modifications de fichiers. Et j'ai utilisé WatchService en java.nio. Je peux réussir à écouter fichier créé l'événement. Mais je ne peux pas écouter de fichier modifier l'événement. J'ai vérifié officiel java tutoriel, mais encore de la difficulté.
Voici le code source.
import static java.nio.file.LinkOption.NOFOLLOW_LINKS;
import static java.nio.file.StandardWatchEventKinds.ENTRY_CREATE;
import static java.nio.file.StandardWatchEventKinds.OVERFLOW;
import static java.nio.file.StandardWatchEventKinds.ENTRY_DELETE;
import static java.nio.file.StandardWatchEventKinds.ENTRY_MODIFY;
import java.io.File;
import java.io.IOException;
import java.nio.file.FileSystem;
import java.nio.file.Files;
import java.nio.file.Path;
import java.nio.file.WatchEvent;
import java.nio.file.WatchEvent.Kind;
import java.nio.file.WatchKey;
import java.nio.file.WatchService;
public class MainWatch {
public static void watchDirectoryPath(Path path) {
//Sanity check - Check if path is a folder
try {
Boolean isFolder = (Boolean) Files.getAttribute(path,
"basic:isDirectory", NOFOLLOW_LINKS);
if (!isFolder) {
throw new IllegalArgumentException("Path: " + path
+ " is not a folder");
}
} catch (IOException ioe) {
//Folder does not exists
ioe.printStackTrace();
}
System.out.println("Watching path: " + path);
//We obtain the file system of the Path
FileSystem fs = path.getFileSystem();
//We create the new WatchService using the new try() block
try (WatchService service = fs.newWatchService()) {
//We register the path to the service
//We watch for creation events
path.register(service, ENTRY_CREATE);
path.register(service, ENTRY_MODIFY);
path.register(service, ENTRY_DELETE);
//Start the infinite polling loop
WatchKey key = null;
while (true) {
key = service.take();
//Dequeueing events
Kind<?> kind = null;
for (WatchEvent<?> watchEvent : key.pollEvents()) {
//Get the type of the event
kind = watchEvent.kind();
if (OVERFLOW == kind) {
continue; //loop
} else if (ENTRY_CREATE == kind) {
//A new Path was created
Path newPath = ((WatchEvent<Path>) watchEvent)
.context();
//Output
System.out.println("New path created: " + newPath);
} else if (ENTRY_MODIFY == kind) {
//modified
Path newPath = ((WatchEvent<Path>) watchEvent)
.context();
//Output
System.out.println("New path modified: " + newPath);
}
}
if (!key.reset()) {
break; //loop
}
}
} catch (IOException ioe) {
ioe.printStackTrace();
} catch (InterruptedException ie) {
ie.printStackTrace();
}
}
public static void main(String[] args) throws IOException,
InterruptedException {
//Folder we are going to watch
//Path folder =
//Paths.get(System.getProperty("C:\\Users\\Isuru\\Downloads"));
File dir = new File("C:\\Users\\Isuru\\Downloads");
watchDirectoryPath(dir.toPath());
}
}
- Quel système d'exploitation et la version de Java?
- Windows 8 et Java 1.7
- Avez-vous essayé le "stock" WatchDir.java ? Il fonctionne sur Linux, au moins.
Vous devez vous connecter pour publier un commentaire.
En fait vous avez pas souscrit à des événements. Seul le dernier auditeur a été enregistré avec ENTRY_DELETE événements de type.
De s'inscrire pour toutes sortes d'événements à la fois, vous devez utiliser:
Avertissement! Sans vergogne l'auto-promotion!
J'ai créé un wrapper autour de Java 1.7 du
WatchService
qui permet l'enregistrement d'un répertoire et un certain nombre de glob modèles. Cette classe va prendre soin de filtrage et n'émettent que des événements qui vous intéressent.Code complet est dans ce repo.
import java.util.stream
et certainsdefault
méthodes. @nterry Avez-vous publier la version de java 7 n'importe où? Tnks.J'ai fait quelques classes pour cette.
et
et
et
Vérifier ce Code...
https://github.com/omkar9999/FileWatcherHandler
Ce projet permet de regarder les fichiers pour les différents événements de fichier, par exemple, créer, modifier & supprimer et ensuite agir sur ces événements de manière générique.
Comment l'Utiliser?
Créer un Chemin d'accès de l'objet représentant le répertoire à surveiller les événements de fichier.
Mettre en œuvre les FileHandler interface pour effectuer une action détectée par des événements de fichiers enregistrés.
Créer une instance d'une mise en œuvre FileHandler
Créer une instance d'un FileWatcher en passant chemin, un exemple de mise en œuvre FileHandler, et les types d'événements de fichier que vous souhaitez surveiller séparés par des virgules.
Maintenant Créer et démarrer un nouveau Thread.
Ce thread va commencer à l'interroger pour votre fichier enregistré événements et invoquer personnalisé de votre poignée de méthode une fois l'un quelconque des événements inscrits sont détectés.
public class FileWatcher implements Runnable {
}