Maison > Java > javaDidacticiel > Comment implémenter la fonctionnalité Unix « tail -f » en Java ?

Comment implémenter la fonctionnalité Unix « tail -f » en Java ?

Mary-Kate Olsen
Libérer: 2024-12-04 18:15:14
original
328 Les gens l'ont consulté

How to Implement Unix

Émuler "tail -f" Unix en Java

La mise en œuvre de la fonctionnalité de l'utilitaire "tail -f" en Java implique de trouver un technique ou bibliothèque capable de surveiller un fichier pour les nouveaux ajouts et de permettre au programme de lire en permanence ces nouvelles lignes. Pour y parvenir, envisagez les approches suivantes :

Classe Apache Commons Tailer

Une option notable est la classe Tailer d'Apache Commons IO. Cette classe fournit une solution simple pour surveiller les fichiers et leurs modifications. Il permet la lecture continue des nouvelles lignes ajoutées au fichier, similaire au comportement de "tail -f". L'intégration avec la classe Tailer peut être réalisée à l'aide du code suivant :

Tailer tailer = Tailer.create(new File("application.log"), new TailerListener() {
    @Override
    public void handle(String line) {
        // Perform desired operations on the newly added line
    }
});
tailer.run();
Copier après la connexion

Implémentation de surveillance de fichiers personnalisée

Alternativement, on pourrait créer une implémentation de surveillance de fichiers personnalisée qui régulièrement vérifie les changements de taille de fichier et met à jour son tampon interne en conséquence. Cette approche nécessite une compréhension plus approfondie du comportement du système de fichiers et des mécanismes d'écoute des événements au sein de Java. Voici un exemple simplifié :

import java.io.File;
import java.io.IOException;
import java.nio.file.*;
import java.nio.file.attribute.BasicFileAttributes;

public class TailFileMonitor implements Runnable {

    private File file;
    private long lastFileSize;

    public TailFileMonitor(File file) {
        this.file = file;
        this.lastFileSize = file.length();
    }

    @Override
    public void run() {
        Path filePath = file.toPath();
        try {
            WatchKey watchKey = filePath.getParent().register(new WatchService(), StandardWatchEventKinds.ENTRY_MODIFY);
            while (true) {
                WatchKey key = watchKey.poll();
                if (key == watchKey) {
                    for (WatchEvent<?> event : key.pollEvents()) {
                        WatchEvent.Kind<?> kind = event.kind();
                        if (kind == StandardWatchEventKinds.ENTRY_MODIFY && event.context().toString().equals(file.getName())) {
                            tailFile();
                        }
                    }
                }
                key.reset();
            }
        } catch (IOException e) {
            // Handle IO exceptions
        }
    }

    private void tailFile() {
        long currentFileSize = file.length();
        if (currentFileSize != lastFileSize) {
            try (BufferedReader br = new BufferedReader(new FileReader(file))) {
                br.skip(lastFileSize);
                String line;
                while ((line = br.readLine()) != null) {
                    // Process newly added lines
                }
                lastFileSize = currentFileSize;
            } catch (IOException e) {
                // Handle IO exceptions
            }
        }
    }
}
Copier après la connexion

Pour utiliser le moniteur personnalisé, créez une instance et exécutez-la en tant que thread. Il surveillera constamment les modifications apportées au fichier et mettra à jour le tampon en conséquence.

Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!

source:php.cn
Déclaration de ce site Web
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn
Derniers articles par auteur
Tutoriels populaires
Plus>
Derniers téléchargements
Plus>
effets Web
Code source du site Web
Matériel du site Web
Modèle frontal