Mémo: [Java] Si un fichier se trouve dans le répertoire surveillé, traitez-le.

Contexte

La dernière fois, j'ai écrit Process and output CSV file. Je souhaite traiter le fichier CSV lorsqu'il arrive dans le répertoire cible. J'ai pensé, alors je vais écrire le code.

監視.png

** Tout d'abord, surveillez le répertoire **

test.java


import java.nio.file.FileSystems;
import java.nio.file.Path;
import java.nio.file.Paths;
import java.nio.file.WatchEvent;
import java.nio.file.WatchKey;
import java.nio.file.WatchService;
import java.nio.file.Watchable;

import static java.nio.file.StandardWatchEventKinds.*;
import static java.nio.file.WatchEvent.*;

public class test {

    public static void main(String[] args) throws Exception {
        Path dir = Paths.get("C://develop//BOX");
        WatchService watcher = FileSystems.getDefault().newWatchService();
        dir.register(watcher, ENTRY_CREATE, ENTRY_DELETE, ENTRY_MODIFY);

        for (;;) {
            WatchKey watchKey = watcher.take();
            for (WatchEvent<?> event: watchKey.pollEvents()) {
                if (event.kind() == OVERFLOW) continue;

                WatchEvent<Path> ev = cast(event);
                Path name = ev.context();
                Path child = dir.resolve(name);
                System.out.format("%s: %s\n", event.kind().name(), child);
            }
            watchKey.reset();
        }
    }

    @SuppressWarnings("unchecked")
    static <T> WatchEvent<T> cast(WatchEvent<?> event) {
        return (WatchEvent<T>)event;
    }
}

Maintenant, créez un répertoire appelé ** BOX ** dans ** C: \ develop **, 1.png

Essayez de compiler test.java n'importe où et d'exécuter la classe. (* Cette fois, je cours avec D: ) 2.png

Hou la la! Si vous obtenez une erreur lors de la compilation: débutant: ** ici ** Ce sera utile.

Maintenant, exécutez le fichier de classe. Essayez de mettre un fichier approprié dans le répertoire BOX. 3.png

Oups! L'exemple .txt que j'ai mis dans le répertoire Il dit ENTRY_CREATE et ENTRY_MODIFY. 4.png

Lorsque je supprime le fichier du répertoire, je vois ENTRY_DELETE. 5.png

Je pense que vous pouvez le comprendre après l'avoir déplacé, alors j'ai collé l'image lorsque je l'ai déplacée en premier Ceci est écrit dans test.java. (Le commentaire est écrit dans mon interprétation, donc j'ai peut-être fait une erreur ...) La deuxième ligne ** WatchService watcher = FileSystems.getDefault (). NewWatchService (); ** Cela semble être une phrase fixe, je vais donc l'utiliser telle quelle sans réfléchir profondément.

Path dir = Paths.get("C://develop//BOX");                            //"dir"Spécifiez le répertoire à surveiller dans
WatchService watcher = FileSystems.getDefault().newWatchService();   //Service de montre"watcher"Créé avec le nom
dir.register(watcher, ENTRY_CREATE, ENTRY_DELETE, ENTRY_MODIFY);     //"dir"Spécifiez l'événement à surveiller dans(Créer,Effacer,Changement)
for (;;) {                                                           //Implémenter une boucle infinie pour attendre un événement
   WatchKey watchKey = watcher.take();                               //Clé de l'observateur de l'observateur"watchKey"Obtenir
   for (WatchEvent<?> event: watchKey.pollEvents()) {                //Vous pouvez obtenir la liste qui stocke WatchEvent avec la méthode pollEvents.
       if (event.kind() == OVERFLOW) continue;                       //"OVERFLOW"Est un événement de surveillance spécial qui indique que l'événement a disparu ou a été détruit

        WatchEvent<Path> ev = cast(event);
        Path name = ev.context();                                    //"name"Entrez dans le contexte de l'événement et définissez le nom du fichier
        Path child = dir.resolve(name);                              //Chemin complet avec méthode de résolution("dir"Sur le chemin de"name"Ajoutée)L'ensemble
        System.out.format("%s: %s\n", event.kind().name(), child);   //Au moment de la sortie, [nom de l'événement:Instructions de sortie avec [Chemin complet du fichier]
   }
   watchKey.reset();                                                 //Réinitialiser la clé de la montre(Pour remettre l'état WatchKey à READY)

** Combinez le traitement pour traiter csv **

Code précédent [Traiter (extraire, modifier) le csv lu et la sortie]

test.java


import java.io.BufferedReader;
import java.io.BufferedWriter;
import java.io.FileReader;
import java.io.FileWriter;
import java.io.IOException;
import java.util.ArrayList;
import java.util.regex.Matcher;
import java.util.regex.Pattern;

public class test{

    public static void main(String[] args) {
        process("20180712.csv",  ":00,","output.csv");
    }

    public static void process(String read_file, String searchString, String output_file){

        try(FileReader fr = new FileReader(read_file);BufferedReader br = new BufferedReader(fr);
            FileWriter fw = new FileWriter(output_file);BufferedWriter bw = new BufferedWriter(fw)){

            String line;
            while ((line = br.readLine()) != null) {
                Pattern p = Pattern.compile(searchString);
                Matcher m = p.matcher(line);
                if (m.find()){
                    String[] csvArray;
                    csvArray = line.split(",");
                    String time  = csvArray[0];
                    float press = Float.parseFloat(csvArray[1])%10000;
                    String pressure = String.format("%.2f", press);
                    String temperature  = csvArray[2];
                    String outputLine = String.join(",",time,pressure,temperature);
                    bw.write(outputLine);
                    bw.newLine();
                }else{ 
                }
            }
        } catch (IOException ex) {
            ex.printStackTrace();
        }
    }
}

Le code que j'ai écrit ci-dessus n'a pas beaucoup changé par rapport au code précédent. C'est presque juste combiné.

test.java


import java.nio.file.FileSystems;      //Requis pour la surveillance des répertoires
import java.nio.file.Path;
import java.nio.file.Paths;
import java.nio.file.WatchEvent;
import java.nio.file.WatchKey;
import java.nio.file.WatchService;
import java.nio.file.Watchable;
import static java.nio.file.StandardWatchEventKinds.*;
import static java.nio.file.WatchEvent.*;

import java.io.BufferedReader;        //Requis pour traiter et sortir le csv
import java.io.BufferedWriter;
import java.io.FileReader;
import java.io.FileWriter;
import java.io.IOException;
import java.util.ArrayList;
import java.util.regex.Matcher;
import java.util.regex.Pattern;

public class test {

    public static void main(String[] args) throws Exception {
        
        Path dir = Paths.get(System.getenv("CSV_DIR"));       //Cette fois, le répertoire à surveiller est une variable d'environnement."CSV_DIR"Mis à
        WatchService watcher = FileSystems.getDefault().newWatchService();
        dir.register(watcher, ENTRY_CREATE);                  //Cette fois ENTRÉE_OK si seul CREATE est détecté
   
        for (;;) {
            WatchKey watchKey = watcher.take();
            for (WatchEvent<?> event: watchKey.pollEvents()) {
                if (event.kind() == OVERFLOW) continue;              
                WatchEvent<Path> ev = cast(event);
                Path name = ev.context();
                Path child = dir.resolve(name);
                String newfile =String.format("%s", child);

                process(newfile, ":00,","D://tedkuma//★"+name); //Passez le chemin complet du fichier détecté au fichier lu par le processus
                System.out.println("Output success:"+name);
            }
            watchKey.reset();
        }  
    }

    @SuppressWarnings("unchecked")
    static <T> WatchEvent<T> cast(WatchEvent<?> event) {
        return (WatchEvent<T>)event;
    }

    public static void process(String read_file, String searchString, String output_file){ //Ce qui suit est le même que le précédent

        try(FileReader fr = new FileReader(read_file);BufferedReader br = new BufferedReader(fr);
            FileWriter fw = new FileWriter(output_file);BufferedWriter bw = new BufferedWriter(fw)){

            String line;
            while ((line = br.readLine()) != null) {
                Pattern p = Pattern.compile(searchString);
                Matcher m = p.matcher(line);
                if (m.find()){
                    String[] csvArray;
                    csvArray = line.split(",");
                    String time  = csvArray[0];
                    float press = Float.parseFloat(csvArray[1])%10000;
                    String pressure = String.format("%.2f", press);
                    String temperature  = csvArray[2];
                    String outputLine = String.join(",",time,pressure,temperature);
                    bw.write(outputLine);
                    bw.newLine();
                }else{ 
                }
            }
        } catch (IOException ex) {
            ex.printStackTrace();
        }
    }
}

Puisque les commentaires japonais et les marques ★ sont inclus dans le fichier java javac seul entraînera une erreur de compilation: sueur: : crâne: Erreur: Ce caractère ne peut pas être mappé au codage MS932, il apparaîtra donc. Cette fois, je compile avec ** javac -encodhing utf-8 test.java **. Lançons-le. 11.png

J'ai défini la variable d'environnement "CSV_DIR" à l'emplacement C: \ develop \ monitor. (Ce répertoire surveillé) Placez-y le fichier CSV que vous souhaitez traiter. 12.png

Le nom du fichier que vous avez placé dans le répertoire s'affiche après le succès de la sortie:. 13.png

Vérifiez le répertoire tedkuma du lecteur D spécifié comme destination de sortie. Un fichier avec une étoile au début du nom de fichier est sorti, et le csv à l'intérieur est également traité. 14.png

Cette fois, c'est fini.

Recommended Posts

Mémo: [Java] Si un fichier se trouve dans le répertoire surveillé, traitez-le.
Java11: exécuter le code Java dans un seul fichier tel quel
Comment enregistrer des fichiers avec l'extension spécifiée sous le répertoire spécifié en Java dans la liste
Décompressez le fichier zip en Java
Obtenez l'URL publique du fichier privé de Flickr en Java
Déterminer si un clavier personnalisé est activé dans Android Studio (Java)
Qu'est-ce qu'une classe en langage Java (3 /?)
Mémo: [Java] Vérifiez le contenu du répertoire
Organisation des notes dans la tête (Java-Arrangement)
Quelle est la meilleure lecture de fichier (Java)
Qu'est-ce qu'une classe en langage Java (1 /?)
Qu'est-ce qu'une classe en langage Java (2 /?)
Quelle est la méthode principale en Java?
[Java8] Recherchez le répertoire et récupérez le fichier
L'histoire de l'oubli de fermer un fichier en Java et de l'échec
Exemple de programme qui renvoie la valeur de hachage d'un fichier en Java
Comment obtenir le chemin absolu d'un répertoire s'exécutant en Java
Même si le chemin du fichier de propriétés est spécifié dans l'option -cp, il n'est pas reconnu comme chemin de classe.
Lire une chaîne dans un fichier PDF avec Java
Une histoire sur le JDK à l'ère de Java 11
Mémo organisé dans la tête (syntaxe Java --Control)
Java: Téléchargez le fichier et enregistrez-le à l'emplacement sélectionné dans la boîte de dialogue [Utiliser HttpClient]
La version ruby est gérée dans le fichier .rbenv / version
Le type d'intersection introduit dans Java 10 est incroyable (?)
Mesurer la taille d'un dossier avec Java
Organisation des notes dans la tête (Java - édition d'instance)
Un fichier bat qui utilise Java dans Windows
Comment compresser un fichier JAVA CSV et le gérer dans un tableau d'octets
[Java] Lire les fichiers dans src / main / resources
[Java] Est-il inutile de vérifier "l'identité" dans l'implémentation de la méthode equals ()?
Mémo organisé dans la tête (Java - type de données)
Je ne me souviens pas de l'entrée / sortie du fichier texte en Java, alors je l'ai résumé.
[Java] Quelque chose est affiché comme "-0.0" dans la sortie
[Java] Lors de la mise d'une chaîne de caractères dans le cas de l'instruction switch, il est nécessaire d'en faire une expression constante
Même si je souhaite convertir le contenu d'un objet de données en JSON en Java, il existe une référence circulaire ...
[Java] Informations entières des caractères du fichier texte acquises par la méthode read ()
La fin de la programmation catastrophique # 03 "Comparaison d'entiers, si" a> b ", supposons que c'est" a --b> 0 ""
Accédez au fichier war dans le répertoire racine de Tomcat
Quel est le meilleur, Kotlin ou futur Java?
Ecrire une classe en Kotlin et l'appeler en Java
[Mémo personnel] Créez une copie complète simple avec Java
Remarque sur l'initialisation des champs dans le didacticiel Java
[Java] Récupère le fichier dans le fichier jar quel que soit l'environnement
Sortie true avec if (a == 1 && a == 2 && a == 3) en Java (identifiant invisible)
Comment convertir un fichier en tableau d'octets en Java
21 Lire et exécuter le script à partir du fichier
L'histoire que .java est également construite dans Unity 2018
Comment effectuer un processus spécifique lorsque le bouton de retour est enfoncé dans le fragment Android
Si vous souhaitez transformer une application Java en une image Docker, il est pratique d'utiliser jib.
Lorsqu'un fichier Java créé avec l'éditeur Atom est déformé lorsqu'il est exécuté à l'invite de commande
Même si j'écris le paramètre de STRICT_QUOTE_ESCAPING dans CATALINA_OPTS dans tomcat8.5, il n'est pas reflété.
Cela ne fonctionne pas si la clé Map est un tableau