Anmerkung: [Java] Wenn sich eine Datei im überwachten Verzeichnis befindet, verarbeiten Sie sie.

Hintergrund

Letztes Mal habe ich [CSV-Datei verarbeiten und ausgeben] geschrieben (https://qiita.com/tedkuma/items/6d4342232ca4433d2566). Ich möchte die CSV-Datei verarbeiten, wenn sie im Zielverzeichnis eingeht. Ich dachte, also werde ich den Code aufschreiben.

監視.png

** Überwachen Sie zuerst das Verzeichnis **

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;
    }
}

Erstellen Sie nun ein Verzeichnis mit dem Namen ** BOX ** in ** C: \ Develop **, 1.png

Versuchen Sie, test.java überall zu kompilieren und die Klasse auszuführen. (* Diesmal laufe ich mit D: ) 2.png

Beeindruckend! Wenn beim Kompilieren eine Fehlermeldung angezeigt wird: Anfänger: ** hier ** Dies ist hilfreich.

Führen Sie nun die Klassendatei aus. Versuchen Sie, eine geeignete Datei in das BOX-Verzeichnis zu stellen. 3.png

Hoppla! Die Beispiel-TXT, die ich in das Verzeichnis gestellt habe Es heißt ENTRY_CREATE und ENTRY_MODIFY. 4.png

Wenn ich die Datei aus dem Verzeichnis lösche, wird ENTRY_DELETE angezeigt. 5.png

Ich denke, dass Sie es verstehen können, nachdem Sie es tatsächlich verschoben haben, also habe ich das Bild eingefügt, als ich es zuerst verschoben habe Dies ist in test.java geschrieben. (Der Kommentar ist in meiner Interpretation geschrieben, daher habe ich möglicherweise einen Fehler gemacht ...) Die zweite Zeile ** WatchService watcher = FileSystems.getDefault (). NewWatchService (); ** Es scheint ein fester Satz zu sein, also werde ich ihn so verwenden, wie er ist, ohne tief nachzudenken.

Path dir = Paths.get("C://develop//BOX");                            //"dir"Geben Sie das Verzeichnis an, in dem überwacht werden soll
WatchService watcher = FileSystems.getDefault().newWatchService();   //WatchService"watcher"Erstellt mit dem Namen
dir.register(watcher, ENTRY_CREATE, ENTRY_DELETE, ENTRY_MODIFY);     //"dir"Geben Sie das Ereignis an, in dem überwacht werden soll(Erstellen,Löschen,Veränderung)
for (;;) {                                                           //Implementieren Sie eine Endlosschleife, um auf ein Ereignis zu warten
   WatchKey watchKey = watcher.take();                               //Beobachterschlüssel vom Beobachter"watchKey"Bekommen
   for (WatchEvent<?> event: watchKey.pollEvents()) {                //Sie können die Liste, in der WatchEvent gespeichert ist, mit der pollEvents-Methode abrufen.
       if (event.kind() == OVERFLOW) continue;                       //"OVERFLOW"Ist ein spezielles Überwachungsereignis, das anzeigt, dass das Ereignis verschwunden oder zerstört wurde

        WatchEvent<Path> ev = cast(event);
        Path name = ev.context();                                    //"name"Holen Sie sich in Ereigniskontext und legen Sie den Dateinamen fest
        Path child = dir.resolve(name);                              //Vollständiger Pfad mit Auflösungsmethode("dir"Auf dem Weg von"name"Hinzugefügt)Der Satz
        System.out.format("%s: %s\n", event.kind().name(), child);   //Zum Zeitpunkt der Ausgabe [Ereignisname:Anweisungen zur Ausgabe mit [Vollständiger Pfad der Datei]
   }
   watchKey.reset();                                                 //Setzen Sie die Uhrentaste zurück(Um den WatchKey-Status auf READY zurückzusetzen)

** Kombiniere die Verarbeitung, um CSV zu verarbeiten **

Vorheriger Code [Verarbeitete (extrahieren, ändern) die gelesene CSV und Ausgabe]

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();
        }
    }
}

Der Code, den ich oben geschrieben habe, hat sich gegenüber dem vorherigen Code nicht wesentlich geändert. Es ist fast nur kombiniert.

test.java


import java.nio.file.FileSystems;      //Erforderlich für die Verzeichnisüberwachung
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;        //Erforderlich, um CSV zu verarbeiten und auszugeben
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"));       //Dieses Mal ist das zu überwachende Verzeichnis eine Umgebungsvariable."CSV_DIR"Einstellen
        WatchService watcher = FileSystems.getDefault().newWatchService();
        dir.register(watcher, ENTRY_CREATE);                  //Diesmal ENTRY_OK, wenn nur CREATE erkannt wird
   
        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); //Übergeben Sie den vollständigen Pfad der erkannten Datei an die vom Prozess gelesene Datei
                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){ //Das Folgende ist das gleiche wie das vorherige

        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();
        }
    }
}

Da japanische Kommentare und ★ Markierungen in der Java-Datei enthalten sind Javac allein führt zu einem Kompilierungsfehler: Schweiß: : schädel: Fehler: Dieses Zeichen kann nicht der Codierung von MS932 zugeordnet werden, daher wird es angezeigt. Dieses Mal kompiliere ich mit ** javac -encodhing utf-8 test.java **. Lass es uns laufen. 11.png

Ich habe die Umgebungsvariable "CSV_DIR" auf den Speicherort C: \ Develop \ Monitored gesetzt. (Dieses überwachte Verzeichnis) Fügen Sie die CSV-Datei, die Sie verarbeiten möchten, in diese ein. 12.png

Der Name der Datei, die Sie in das Verzeichnis gestellt haben, wird nach erfolgreicher Ausgabe angezeigt :. 13.png

Überprüfen Sie das Tedkuma-Verzeichnis des als Ausgabeziel angegebenen D-Laufwerks. Eine Datei mit einem Stern am Anfang des Dateinamens wird ausgegeben, und die darin enthaltene CSV wird ebenfalls verarbeitet. 14.png

Diese Zeit ist vorbei.

Recommended Posts

Anmerkung: [Java] Wenn sich eine Datei im überwachten Verzeichnis befindet, verarbeiten Sie sie.
Java11: Führen Sie Java-Code unverändert in einer einzelnen Datei aus
Speichern von Dateien mit der angegebenen Erweiterung unter dem in Java angegebenen Verzeichnis in der Liste
Entpacken Sie die Zip-Datei in Java
Rufen Sie die öffentliche URL der privaten Datei von Flickr in Java ab
Feststellen, ob eine benutzerdefinierte Tastatur in Android Studio (Java) aktiviert ist
Was ist eine Klasse in der Java-Sprache (3 /?)
Anmerkung: [Java] Überprüfen Sie den Inhalt des Verzeichnisses
Notizen im Kopf organisieren (Java-Arrangement)
Was ist das beste Lesen von Dateien (Java)
Was ist eine Klasse in der Java-Sprache (1 /?)
Was ist eine Klasse in der Java-Sprache (2 /?)
Was ist die Hauptmethode in Java?
[Java8] Durchsuchen Sie das Verzeichnis und holen Sie sich die Datei
Die Geschichte, zu vergessen, eine Datei in Java zu schließen und zu scheitern
Beispielprogramm, das den Hashwert einer Datei in Java zurückgibt
So ermitteln Sie den absoluten Pfad eines in Java ausgeführten Verzeichnisses
Obwohl der Pfad der Eigenschaftendatei in der Option -cp angegeben ist, wird er nicht als Klassenpfad erkannt.
Lesen Sie eine Zeichenfolge in einer PDF-Datei mit Java
Eine Geschichte über das JDK in der Java 11-Ära
Organisiertes Memo im Kopf (Java - Control Syntax)
Java: Laden Sie die Datei herunter und speichern Sie sie an dem im Dialogfeld [Use HttpClient] ausgewählten Speicherort.
Die Ruby-Version wird in der .rbenv / version-Datei verwaltet
Der in Java 10 eingeführte Schnittpunkttyp ist erstaunlich (?)
Messen Sie die Größe eines Ordners mit Java
Notizen im Kopf organisieren (Java - Instance Edition)
Eine Bat-Datei, die Java in Windows verwendet
So komprimieren Sie eine JAVA-CSV-Datei und verwalten sie in einem Byte-Array
[Java] Dateien in src / main / resources lesen
[Java] Ist es nicht erforderlich, "Identität" bei der Implementierung der equals () -Methode zu überprüfen?
Organisiertes Memo im Kopf (Java - Datentyp)
Ich kann mich nicht an die Eingabe / Ausgabe von Textdateien in Java erinnern, also habe ich sie zusammengefasst.
[Java] In der Ausgabe wird etwas als "-0.0" angezeigt
[Java] Wenn Sie eine Zeichenfolge in die switch-Anweisung einfügen, müssen Sie sie zu einem konstanten Ausdruck machen
Auch wenn ich den Inhalt eines Datenobjekts in Java in JSON konvertieren möchte, gibt es einen Zirkelverweis ...
[Java] Ganzzahlige Informationen von Zeichen in der Textdatei, die mit der Methode read () erfasst wurden
Das Ende der katastrophalen Programmierung # 03 "Der Vergleich von ganzen Zahlen, wenn" a> b ", nimmt an, dass es" a - b> 0 "ist."
Greifen Sie auf die War-Datei im Stammverzeichnis von Tomcat zu
Was ist besser, Kotlin oder zukünftiges Java?
Schreiben Sie eine Klasse in Kotlin und nennen Sie sie in Java
[Persönliches Memo] Erstellen Sie eine einfache, tiefe Kopie mit Java
Ein Hinweis zum Initialisieren von Feldern im Java-Lernprogramm
[Java] Holen Sie sich die Datei unabhängig von der Umgebung in das JAR
Ausgabe true mit if (a == 1 && a == 2 && a == 3) in Java (Invisible Identifier)
So konvertieren Sie eine Datei in ein Byte-Array in Java
21 Lesen Sie das Skript aus der Datei und führen Sie es aus
Die Geschichte, dass .java auch in Unity 2018 erstellt wurde
So führen Sie einen bestimmten Vorgang aus, wenn die Zurück-Taste im Android-Fragment gedrückt wird
Wenn Sie eine Java-Anwendung in ein Docker-Image verwandeln möchten, ist es praktisch, Jib zu verwenden.
Wenn eine mit dem Atom-Editor erstellte Java-Datei bei der Ausführung an der Eingabeaufforderung verstümmelt wird
Selbst wenn ich die Einstellung von STRICT_QUOTE_ESCAPING in CATALINA_OPTS in tomcat8.5 schreibe, wird sie nicht wiedergegeben.
Es funktioniert nicht, wenn der Map-Schlüssel ein Array ist