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
Mary-Kate Olsenoriginal
2024-12-04 18:15:14354parcourir

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

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

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!

Déclaration:
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