2009-06-12 8 views
3

J'ai besoin d'enrouler la commande Unix "tail -f" dans un BufferedInputStream. Je ne veux pas simuler ou imiter la queue comme indiqué par this question. Au contraire, je veux utiliser la queue, en attendant qu'il me donne une nouvelle ligne.Java "queue -f" wrapper

Répondre

14

Votre meilleur pari est d'utiliser la classe Process et lire avec un Scanner:

Runtime r = Runtime.getRuntime() 
Process p = r.exec("tail -f") 
Scanner s = new Scanner(p.getInputStream()) 
while (s.hasNextLine()) { 
    String line = s.nextLine() 
    // Do whatever you want with the output. 
} 

hasNextLine() devrait bloquer comme il attend plus depuis le flux d'entrée, de sorte que vous ne serez pas en attente occupé en tant que données est disponible en

+0

Merci! Il fonctionne très bien. – geowa4

+1

Le seul problème est qu'il nécessite un nouveau caractère de ligne à la fin – geowa4

1

Regardez Runtime.exec (commande String). Retourne un Processus objet qui a des flux d'entrée et de sortie.

+0

Cela semble être ce que je suis à la recherche. Je vais essayer ça, merci. – geowa4

+0

Pas de problème, n'hésitez pas à le remettre en cause;) – Gandalf

0

Je suppose que les approches de type system() et popen() ne fonctionneront pas car elles bloqueront votre programme jusqu'à la fin de la commande tail.

Je pense que vous pourriez rediriger la sortie vers un fichier et utiliser 'diff' par rapport à la dernière version pour voir quelles lignes sont nouvelles?

0

Si vous avez la commande unix

tail -f <file> | <some java program> 

Puis la queue apparaîtrait comme un InputStream qui peut bloquer pendant une période de temps. Si vous ne voulez pas vous bloquer, vous utiliserez les paquets nio. Je crois que la plupart des autres façons d'accéder à la commande de queue (comme Process) se traduit par un InputStream similaire.

1

vérifier aussi ProcessBuilder.

Process tail = new ProcessBuilder("tail", "-f", file).start(); 
BufferedInputStream bis = new BufferedInputStream(tail.getInputStream()) 

file est une chaîne comme "/ var/log/messages".