IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Entrée/Sortie Java Discussion :

Comment faire un "tail -f" en Java


Sujet :

Entrée/Sortie Java

  1. #1
    Membre confirmé
    Profil pro
    Inscrit en
    Mars 2006
    Messages
    97
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2006
    Messages : 97
    Par défaut Comment faire un "tail -f" en Java
    Bonjour,

    Sous UNIX, la command "tail -f <fichier>" permet de voir les nouvelles lignes ajoutées au fichier en temps réel. Comment vous programmeriez l'équivalent en Java ?

  2. #2
    Membre confirmé
    Inscrit en
    Février 2004
    Messages
    90
    Détails du profil
    Informations forums :
    Inscription : Février 2004
    Messages : 90
    Par défaut
    Ta question n'est pas trop claire , mais je ponse que ce n'est pas fesable.
    la console java en effet, te mis les derniere ligne de l'output donc a mon avis (Un tail -f)
    ciao

  3. #3
    Expert confirmé

    Profil pro
    Fabricant et casseur d'avions
    Inscrit en
    Avril 2004
    Messages
    3 817
    Détails du profil
    Informations personnelles :
    Localisation : France, Tarn (Midi Pyrénées)

    Informations professionnelles :
    Activité : Fabricant et casseur d'avions
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Avril 2004
    Messages : 3 817
    Par défaut
    Citation Envoyé par Alghero
    Ta question n'est pas trop claire , mais je ponse que ce n'est pas fesable.
    la console java en effet, te mis les derniere ligne de l'output donc a mon avis (Un tail -f)
    ciao
    Pas compris là....



    Sinon, tu veux faire quoi exactement? Lancer la commande système, ou avoir un équivalent qui fait la même chose programmé en Java?
    "Errare humanum est, sed perseverare diabolicum"

    Ma page sur DVP.com

  4. #4
    Membre confirmé
    Profil pro
    Inscrit en
    Mars 2006
    Messages
    97
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2006
    Messages : 97
    Par défaut
    Citation Envoyé par plegat
    Pas compris là....



    Sinon, tu veux faire quoi exactement? Lancer la commande système, ou avoir un équivalent qui fait la même chose programmé en Java?
    Je voulais avoir un équivalent de la meme chose mais programmé en Java...
    Comme je pense que c'est lié à de la programmation bas niveau, je pense que ça doit être impossible à faire en Java.

    Pourtant une socket ou un file descriptor d'un fichier c'est la meme chose. Et quand des données sont disponibles sur une socket, le InputStream contient une variable "available" à jour... Pourquoi cela ne marcherait pas sur les files descriptor de fichiers...


  5. #5
    Expert éminent
    Avatar de adiGuba
    Homme Profil pro
    Développeur Java/Web
    Inscrit en
    Avril 2002
    Messages
    13 938
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Développeur Java/Web
    Secteur : Transports

    Informations forums :
    Inscription : Avril 2002
    Messages : 13 938
    Billets dans le blog
    1
    Par défaut
    Salut,

    Citation Envoyé par Grand sorcier
    Comme je pense que c'est lié à de la programmation bas niveau, je pense que ça doit être impossible à faire en Java.
    Ben c'est juste du traitement de fichiers via les I/O... Je ne vois pas pourquoi ce serait impossible à faire...

    Citation Envoyé par Grand sorcier
    Pourtant une socket ou un file descriptor d'un fichier c'est la meme chose. Et quand des données sont disponibles sur une socket, le InputStream contient une variable "available" à jour... Pourquoi cela ne marcherait pas sur les files descriptor de fichiers...
    Ben ca marche exactement pareil justement :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    	public static void tailForEver(File file) throws IOException, InterruptedException {
     
    		final Thread currentThread = Thread.currentThread();
    		InputStream stream = new FileInputStream(file);
    		try {
    			byte[] buf = new byte[8192];
    			int len;
    			while (!currentThread.isInterrupted()) {
    				len = stream.read(buf);
    				if (len<=0) {
    					// Si on a atteint la fin du fichier,
    					// on fait une pause avant de recommencer à lire
    					Thread.sleep(1000);
    					continue;
    				}
    				System.out.write(buf, 0, len);
    			}
    		} finally {
    			stream.close();
    		}
     
    	}
    En tout ca sur mon poste cela fonctionne très bien...

    a++

  6. #6
    Membre confirmé
    Profil pro
    Inscrit en
    Mars 2006
    Messages
    97
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2006
    Messages : 97
    Par défaut


    Bravissimo merci !


  7. #7
    Membre confirmé
    Profil pro
    Inscrit en
    Mars 2006
    Messages
    97
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2006
    Messages : 97
    Par défaut
    En fait j'utilise JMeter sous Windows. Il y a un fichier jmeter.log qui mets des resultats de mes tests en charge.

    Mon problème est qu'il fallait que j'ouvre continuellement le fichier pour avoir les résultats. Mais avec ce code ma vie va s'améliorer

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
     
    import java.io.File;
    import java.io.InputStream;
    import java.io.FileInputStream;
    import java.io.IOException;
    import java.lang.Thread;
    import java.lang.InterruptedException;
     
    public class Tail
    {
    	public static void main (String... args)
    	throws
    		IOException,
    		InterruptedException
    	{
    		if (args.length == 0)
    		{
    			System.out.println ("Need a file name");
    			System.exit (1);
    		}
     
    		File file = new File (args[0]);
    		tailForEver (file);
    		System.exit (0);
    	}
     
    	public static void tailForEver (File file)
    	throws
    		IOException,
    		InterruptedException
    	{
    		final Thread currentThread = Thread.currentThread();
    		InputStream stream = new FileInputStream (file);
    		try
    		{
    			byte[] buf = new byte[8192];
    			int len;
    			while (!currentThread.isInterrupted ())
    			{
    				len = stream.read(buf);
    				if (len<=0)
    				{
    					// Si on a atteint la fin du fichier,
    					// on fait une pause avant de recommencer à lire
    					Thread.sleep (1000);
    					continue;
    				}
    				System.out.write (buf, 0, len);
    			}
    		}
    		finally
    		{
    			stream.close();
    		}
    	}
    }

    Le seul souci qui reste c'est qu'avec "tail" on peut taper sur enter
    pour mettre des lignes vides de séparation avec les nouveaux
    flux qui vont arriver. Or dans mon code il n'y a pas cela...

  8. #8
    Membre confirmé
    Profil pro
    Inscrit en
    Mars 2006
    Messages
    97
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2006
    Messages : 97
    Par défaut
    Les read() étant bloquant, j'utilise available() pour savoir s'il y a de choses à lire. De plus je peux maintenant mettre des lignes blanches comme avec le "tail -f" de UNIX.

    Voici le code final qui me convient bien

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
     
    import java.io.File;
    import java.io.InputStream;
    import java.io.FileInputStream;
    import java.io.IOException;
    import java.lang.Thread;
    import java.lang.InterruptedException;
     
    public class Tail
    {
    	public static void main (String... args)
    	throws
    		IOException,
    		InterruptedException
    	{
    		if (args.length == 0)
    		{
    			System.out.println ("Need a file name");
    			System.exit (1);
    		}
     
    		File file = new File (args[0]);
    		tailForEver (file);
    		System.exit (0);
    	}
     
    	public static void tailForEver (File file)
    	throws
    		IOException,
    		InterruptedException
    	{
    		final Thread currentThread = Thread.currentThread();
    		InputStream stream = new FileInputStream (file);
    		try
    		{
    			byte[] buf = new byte[8192];
    			byte[] input = new byte[128];
    			int len;
    			while (!currentThread.isInterrupted ())
    			{
    				len = System.in.available ();
    				if (len > 0)
    				{
    					System.in.read (input);
    					System.out.println ();
    				}
     
    				len = stream.available ();
    				if (len > 0)
    				{
    					len = stream.read (buf);
    					System.out.write (buf, 0, len);
    				}
     
    				Thread.sleep (100);
    				continue;
    			}
    		}
    		finally
    		{
    			stream.close();
    		}
    	}
    }

  9. #9
    Membre confirmé
    Profil pro
    Inscrit en
    Mars 2006
    Messages
    97
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2006
    Messages : 97
    Par défaut
    Allez un peu d'épuration du code

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
     
    import java.io.File;
    import java.io.InputStream;
    import java.io.FileInputStream;
    import java.io.IOException;
    import java.lang.Thread;
    import java.lang.InterruptedException;
     
    public class Tail
    {
    	public static void main (String... args)
    	throws
    		IOException,
    		InterruptedException
    	{
    		if (args.length == 0)
    		{
    			System.out.println ("Need a file name");
    			System.exit (1);
    		}
     
    		File file = new File (args[0]);
    		tailForEver (file);
    		System.exit (0);
    	}
     
    	public static void tailForEver (File file)
    	throws
    		IOException,
    		InterruptedException
    	{
    		InputStream stream = new FileInputStream (file);
    		try
    		{
    			byte[] buf = new byte[8192];
    			byte[] input = new byte[128];
    			int len;
     
    			while (true)
    			{
    				len = System.in.available ();
    				if (len > 0)
    				{
    					System.in.read (input);
    					System.out.println ();
    				}
     
    				len = stream.available ();
    				if (len > 0)
    				{
    					len = stream.read (buf);
    					System.out.write (buf, 0, len);
    				}
     
    				Thread.sleep (100);
    				continue;
    			}
    		}
    		finally
    		{
    			stream.close();
    		}
    	}
    }

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. [Batch] Comment faire les commandes "TAIL -1" et "cut"
    Par Sarco942 dans le forum Scripts/Batch
    Réponses: 8
    Dernier message: 08/02/2013, 09h53
  2. comment faire un message de type "alert" en java
    Par fracam dans le forum Composants
    Réponses: 4
    Dernier message: 05/12/2005, 17h03
  3. Réponses: 5
    Dernier message: 23/11/2005, 23h08

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo