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

Plateformes (Java EE, Jakarta EE, Spring) et Serveurs Discussion :

Récupérer un morceau de String


Sujet :

Plateformes (Java EE, Jakarta EE, Spring) et Serveurs

  1. #1
    Membre régulier
    Homme Profil pro
    Étudiant
    Inscrit en
    Décembre 2014
    Messages
    162
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Étudiant
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Décembre 2014
    Messages : 162
    Points : 73
    Points
    73
    Par défaut Récupérer un morceau de String
    Bonjour,

    je veux utiliser WatchService et Tailer en même temps, j’ai donc écris les lignes suivantes :

    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
     
                    AgentTailerListener listener = new AgentTailerListener();
                    Tailer tailer;
     
                    WatchService watcher = FileSystems.getDefault().newWatchService();
                    while (true) {
    			WatchKey watchKey;
    			watchKey = Paths.get("/tmp").register(watcher, ENTRY_CREATE);
    			watchKey = watcher.take();
     
    			for (WatchEvent<?> event : watchKey.pollEvents()) {
    				if (event.kind() == StandardWatchEventKinds.ENTRY_CREATE) {
    					tailSource = event.context().toString();
    					System.out.println(tailSource);
    					File file = new File(tailSource);
    					tailer = TailerFactory.createTailer(file, listener);
    					(new Thread(tailer)).start();
    				}
    			}
     
    			watchKey.reset();
    		}
    Néanmoins, ce programme m’affiche
    .goutputstream-44TY1X
    text.log~
    text.log

    Mais je veux récupérer uniquement le text.log.

    Dois-je utiliser une solution à base de scanner (ou équivalent) ou est-ce mon code qui pourrait être résolu en modifiant quelques trucs ?

  2. #2
    Membre chevronné
    Avatar de eulbobo
    Homme Profil pro
    Développeur Java
    Inscrit en
    Novembre 2003
    Messages
    786
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 45
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Développeur Java

    Informations forums :
    Inscription : Novembre 2003
    Messages : 786
    Points : 1 993
    Points
    1 993
    Par défaut
    Ca veut surtout dire que l'éditeur que tu utilises crées 2 fichiers temporaires.

    Tu peux faire en sorte de filtrer par rapport au nom du fichier... Il faut qu'il y ait une extension et qu'elle ne finisse pas par ~ par exemple
    Je ne suis pas mort, j'ai du travail !

  3. #3
    Membre régulier
    Homme Profil pro
    Étudiant
    Inscrit en
    Décembre 2014
    Messages
    162
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Étudiant
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Décembre 2014
    Messages : 162
    Points : 73
    Points
    73
    Par défaut
    J’ai écris ça :
    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
     
                            for (WatchEvent<?> event : watchKey.pollEvents()) {
                                   if (event.kind() == StandardWatchEventKinds.ENTRY_CREATE) {
    					tailSource = event.context().toString();
    					System.out.println(tailSource);
    					File file = new File("/tmp/"+tailSource);
    					String end = "log";
    					if(file.getName().endsWith(end)){
    						tailer = TailerFactory.createTailer(file, listener);
    						(new Thread(tailer)).start();;
     
    					}
     
    				}
    			}
     
    			watchKey.reset();
    }

    et maintenant, ça fonctionne un peu quand je lance la commande echo "auiea" > textiue.log (donc création d’un nouveau fichier) le tailer réagit mais quand je refait un echo "aiu" > textiue.log , il ne réagit pas tout le temps…

  4. #4
    Membre chevronné
    Avatar de eulbobo
    Homme Profil pro
    Développeur Java
    Inscrit en
    Novembre 2003
    Messages
    786
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 45
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Développeur Java

    Informations forums :
    Inscription : Novembre 2003
    Messages : 786
    Points : 1 993
    Points
    1 993
    Par défaut
    Vu le fonctionnement du WatchService (qui dépend BEAUCOUP de ton OS...), tu devrais dans une première étape récupérer uniquement le nom des fichiers créés que tu stockes dans une liste, puis traiter la liste en lançant les threads désirés après coup.

    Essayes déjà ça et dis nous si ça améliore les choses (parce que là comme ça, je ne vois pas pourquoi ça bloquerai)
    Je ne suis pas mort, j'ai du travail !

  5. #5
    Membre régulier
    Homme Profil pro
    Étudiant
    Inscrit en
    Décembre 2014
    Messages
    162
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Étudiant
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Décembre 2014
    Messages : 162
    Points : 73
    Points
    73
    Par défaut
    En fait, je ne sais pas si c’est exactement ce que je veux…

    Pour l’instant, ce n’est qu’un test donc je créé plein de fichier avec le terminal.

    Mais à la fin, un serveur créera un seul fichier par jour tandis que d’un jour sur l’autre, les anciens fichiers seront sauvegardés. Et ce sera ce fichier journalier qui devra être traité par le tailer et pas un ancien ; donc je ne sais pas si une liste me serait utile…

  6. #6
    Membre chevronné
    Avatar de eulbobo
    Homme Profil pro
    Développeur Java
    Inscrit en
    Novembre 2003
    Messages
    786
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 45
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Développeur Java

    Informations forums :
    Inscription : Novembre 2003
    Messages : 786
    Points : 1 993
    Points
    1 993
    Par défaut
    Fais un autre programme qui crée ton fichier directement, ça te permettra d'être sûr que tu n'es pas pollué par des composants externes.

    Dans windows, la création d'un nouveau fichier provoque plusieurs évènements différents, et c'est pas forcément ceux que tu veux (vu qu'il va créer deux fichiers en tout), de même que les éditeurs de textes qui risquent de créer des fichiers temporaires.


    Ton programme de test :
    - création d'un fichier
    - petite pause
    - ajout de texte dans le fichier (avec un buffer que tu flush régulièrement pour déclencher le tail)


    Je pense que c'est la seule solution pour émuler le fonctionnement final que tu veux obtenir
    Je ne suis pas mort, j'ai du travail !

  7. #7
    Membre régulier
    Homme Profil pro
    Étudiant
    Inscrit en
    Décembre 2014
    Messages
    162
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Étudiant
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Décembre 2014
    Messages : 162
    Points : 73
    Points
    73
    Par défaut
    Merci pour ton aide.

    En fait je pense avoir réussi à faire directement ce que je voulais.

    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
     
                            AgentTailerListener listener = new AgentTailerListener();
    			Tailer tailer;
    			String tailSource;
    			Thread thread;
     
    			WatchService watcher = FileSystems.getDefault().newWatchService();
     
    				WatchKey watchKey;
    				watchKey = Paths.get("/tmp").register(watcher, ENTRY_CREATE);
     
                                    //création de la liste dans laquelle je vais mettre les thread que je vais activer puis détruire au fur et à mesure du programme
    				List<Thread> threadList = new ArrayList<Thread>();
    				while (true) {
    					watchKey = watcher.take();
    					for (WatchEvent<?> event : watchKey.pollEvents()) {
    					if (event.kind() == StandardWatchEventKinds.ENTRY_CREATE) {
     
    						tailSource = event.context().toString();
    						System.out.println(tailSource);
    						File file = new File("/tmp/" + tailSource);
    						String end = "log";
    						if (file.getName().endsWith(end)) {
    							tailer= TailerFactory.createTailer(file, listener);
                                                            //je n’arrete pas le thread au premier tour car il n’y en a pas
    							if(threadList.isEmpty()){}
    							else{
    								Thread.sleep(1000);
    								threadList.get(0).stop();
                                                                    threadList.clear();}
    							System.out.println(threadList.size());
    							threadList.add(thread = new Thread(tailer));
    							threadList.get(0).start();
    						}
     
    					}
    				}
     
    				watchKey.reset();
     
     
    			}

  8. #8
    Membre régulier
    Homme Profil pro
    Étudiant
    Inscrit en
    Décembre 2014
    Messages
    162
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Étudiant
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Décembre 2014
    Messages : 162
    Points : 73
    Points
    73
    Par défaut
    Finalement la réponse que je propose est vraiment trop gourmande au niveau des threads.

    Je pense que l’utilisation de ThreadPools serait une bonne idée.

    Mais j’ai totalement changé de plan pour cette partie, je laisse donc cette supposition sans pouvoir aller plus loin.

Discussions similaires

  1. Récupérer un morceau d'une chaîne de caractère
    Par Sekigawa dans le forum Langage
    Réponses: 2
    Dernier message: 01/04/2008, 14h15
  2. récupérer valeur entre " " dans string
    Par L4BiN dans le forum API standards et tierces
    Réponses: 7
    Dernier message: 25/10/2007, 11h35
  3. recuperer un morceau de string
    Par barthelus76 dans le forum Entrée/Sortie
    Réponses: 4
    Dernier message: 27/09/2007, 11h09
  4. Réponses: 7
    Dernier message: 09/05/2007, 21h45
  5. Réponses: 27
    Dernier message: 28/03/2007, 16h09

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