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

Java Discussion :

Quelle est la meilleure méthode pour lire un String ligne par ligne ?


Sujet :

Java

  1. #1
    Membre régulier Avatar de Mr.Robot12
    Homme Profil pro
    Étudiant
    Inscrit en
    Mai 2016
    Messages
    189
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Mai 2016
    Messages : 189
    Points : 81
    Points
    81
    Par défaut Quelle est la meilleure méthode pour lire un String ligne par ligne ?
    Bonjour,
    j'ai une question : Quelle est la meilleure méthode pour lire un String ligne par ligne ?
    je m'explique : j'ai environ 16820 fichiers à lire 1 par 1, c'est des fichiers .eml. je dois lire le corps du message. Jusque là tout va bien
    voici ma fonction qui lit ces fichiers :
    Code JAVA : 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
    public synchronized void lireTout()
        {
            ArrayList<String> allFiles = new ArrayList<String>();
            listeRepertoire(new File("C:\\Users\\moi\\Desktop\\bilans batch satelit 2016\\dossiers extraites"), allFiles);
     
            try
            {
                File f;
                FileReader fr;
                BufferedReader br;
     
                Properties props;
                Session mailSession;
                InputStream source;
                MimeMessage message;
                Email email;
     
                for (String file : allFiles)
                {
                    f = new File(file);
                    fr = new FileReader(f);
                    br = new BufferedReader(fr);
                    System.out.println(f.getAbsolutePath());
     
                    //utilisation de l'API MimeMessage pour ouvrir les fichiers .eml
                    props = System.getProperties();
                    props.put("mail.host", "smtp.dummydomain.com");
                    props.put("mail.transport.protocol", "smtp");
                    mailSession = Session.getDefaultInstance(props, null);
                    source = new FileInputStream(f);
                    message = new MimeMessage(mailSession, source);
     
                    //utilisation de l'API Email pour la lecture du corps des messgages.
                    String body = null;
                    if (!f.getName().endsWith(".html"))
                    {
                        email = EmailConverter.mimeMessageToEmail(message);
                        // System.out.println(email.getText());
                        body = email.getText();
     
                        BufferedReader reader = new BufferedReader(new StringReader(body));
                        String line = reader.readLine();
     
                        while (line != null)
                        {
                            System.out.println(line.length() + " " + line); //pour l'instant je ne fais qu'afficher pour tester
                            line = reader.readLine();
                        }
                        reader.close();
                    }
                    br.close();
                    fr.close();
                }
            }
            catch (IOException | MessagingException exception)
            {
                System.out.println("Erreur lors de la lecture : " + exception.getMessage());
            }
        }

    perso j'ai utilisé BufferedReader reader = new BufferedReader(new StringReader(<string>)); mais j'ai vu qu'il y avait d'autres façons de le faire comme :
    Code JAVA : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    final String eol = System.getProperty("line.separator");
    output = output.substring(output.indexOf(eol + 1));
    ou :
    Code JAVA : Sélectionner tout - Visualiser dans une fenêtre à part
    String[] lines = myString.split(System.getProperty("line.separator"));
    ou encore :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    Scanner scanner = new Scanner(myString);
    while (scanner.hasNextLine()) {
      String line = scanner.nextLine();
      // process the line
    }
    scanner.close();
    voilà
    je voulais juste savoir lequel est le mieux en sachant le nombre de fichiers à lire
    d'après ce que j'ai vu sur internet c'est BufferedReader le plus rapide mais je voulais vous demander pour être sur (pour mon cas)
    merci

  2. #2
    Expert éminent sénior
    Avatar de tchize_
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Avril 2007
    Messages
    25 482
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 45
    Localisation : Belgique

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Avril 2007
    Messages : 25 482
    Points : 48 804
    Points
    48 804
    Par défaut
    LA question est plutot "pourquoi est-ce que tu as besoin de lire un html ligne par ligne?" Les retours à la ligne dans du html n'ont pas de signification particulière. Si le but est d'afficher l'html dans la console, tu peux le faire en envoyant directement ta String incluant le retours à la ligne.

    Au delà de ça, le plus efficace sans se prendre la tête pour décomposer un String, c'est sa méthode split.
    Wrapper la String dans un StringReader et ensuite balancer ça dans une BufferedReader, c'est rajouter plein de strings inutiles dans le chemin et sur compliquer le process.

  3. #3
    Membre régulier Avatar de Mr.Robot12
    Homme Profil pro
    Étudiant
    Inscrit en
    Mai 2016
    Messages
    189
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Mai 2016
    Messages : 189
    Points : 81
    Points
    81
    Par défaut
    en faite pour l'instant je fais de l'affichage dans la console pour tester. mais après ces informations seront mis dans des objets pour ensuite stocker dans une BDD

  4. #4
    Modérateur

    Profil pro
    Inscrit en
    Septembre 2004
    Messages
    12 567
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2004
    Messages : 12 567
    Points : 21 633
    Points
    21 633
    Par défaut
    Peu importe. Ce ne sera pas ligne par ligne de toute façon.

  5. #5
    Membre régulier Avatar de Mr.Robot12
    Homme Profil pro
    Étudiant
    Inscrit en
    Mai 2016
    Messages
    189
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Mai 2016
    Messages : 189
    Points : 81
    Points
    81
    Par défaut
    Citation Envoyé par thelvin Voir le message
    Peu importe. Ce ne sera pas ligne par ligne de toute façon.
    si justement il y a des données que je dois extraire ligne par ligne : c'est la première et la 3e section dans chaque fichier

  6. #6
    Rédacteur

    Avatar de millie
    Profil pro
    Inscrit en
    Juin 2006
    Messages
    7 015
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2006
    Messages : 7 015
    Points : 9 818
    Points
    9 818
    Par défaut
    Je dis ça, je dis rien, mais le code est quand même assez goret.
    Je constate que tu utilises du multicatch, donc que tu es au moins en java 7. Tu peux utiliser les try/with resources pour alléger ton code.

    Cependant. Comme tu utilises une conversion brute et que tu dois dans tous les cas charger en mémoire l'intégralité de ton message, autant utiliser un simple split (comme l'a souligné tchize)

  7. #7
    Membre régulier Avatar de Mr.Robot12
    Homme Profil pro
    Étudiant
    Inscrit en
    Mai 2016
    Messages
    189
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Mai 2016
    Messages : 189
    Points : 81
    Points
    81
    Par défaut
    j'ai jamais utilisé avec try/with ressources donc faut que je vois ça. je suis obligé de lire ligne par ligne pour prendre la bonne info

  8. #8
    Expert éminent sénior
    Avatar de tchize_
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Avril 2007
    Messages
    25 482
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 45
    Localisation : Belgique

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Avril 2007
    Messages : 25 482
    Points : 48 804
    Points
    48 804
    Par défaut
    Citation Envoyé par Mr.Robot12 Voir le message
    j'ai jamais utilisé avec try/with ressources donc faut que je vois ça. je suis obligé de lire ligne par ligne pour prendre la bonne info
    C'est assez étonnant étant donné qu'un html est décomposé par des balises et non pas par des retours à la ligne. Mais on va supposer que tu connait les numéros de ligne dont tu as besoin, parce que ce sont des htmls qui ont été générés par un outil. si tu n'as besoin que de certains lignes, peut être est-il préféréble de répérer les index des 4 "\n" délimitant les sections dont tu as besoin et de juste faire 2 appels à subString. Si les fichiers sont gros, ça devrait limiter le travail.

  9. #9
    Membre régulier Avatar de Mr.Robot12
    Homme Profil pro
    Étudiant
    Inscrit en
    Mai 2016
    Messages
    189
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Mai 2016
    Messages : 189
    Points : 81
    Points
    81
    Par défaut
    premier fichier :Nom : Capture.PNG
Affichages : 771
Taille : 17,4 Ko2e fichier :Nom : Capture2.PNG
Affichages : 809
Taille : 11,0 Ko

    voilà à quoi ressemble le corps des messages. comme vous voyez la section 1 et 3 sont identiques, càd les libellé sont pareilles c'est juste les valeurs qui changent. alors que la section 2 varie d'un fichier à un autre. en gros ce qu'il y a dans les sections 1 et 3 seront mis dans des propriétés d'un objet (nom du batch, version batch, version appli, debut, fin, duree) et ensuite je dois récupérer tout ce qu'il y a dans la section 2 pour le mettre dans une seule propriété (en gros un seul string qui contient toute la section 2 comme présenté dans les fichiers)

    il faut savoir aussi que dans certains fichiers il y a plusieurs fois 3 sections.

  10. #10
    Expert éminent sénior
    Avatar de tchize_
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Avril 2007
    Messages
    25 482
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 45
    Localisation : Belgique

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Avril 2007
    Messages : 25 482
    Points : 48 804
    Points
    48 804
    Par défaut
    donc en gros, c'est plus la structure que les lignes qui t"intéressent. Vu que tout ça se trouve déjà au départ dans une grosse String, je passerais par une regex pour extraire tout ce dont j'ai besoin.

  11. #11
    Membre régulier Avatar de Mr.Robot12
    Homme Profil pro
    Étudiant
    Inscrit en
    Mai 2016
    Messages
    189
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Mai 2016
    Messages : 189
    Points : 81
    Points
    81
    Par défaut
    un regex sur chaque ligne ?

  12. #12
    Expert éminent sénior
    Avatar de tchize_
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Avril 2007
    Messages
    25 482
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 45
    Localisation : Belgique

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Avril 2007
    Messages : 25 482
    Points : 48 804
    Points
    48 804
    Par défaut
    non une regex sur l'ensemble du document, vu que ce que tu cherche en gros c'est entre des marqueur connu. Pas besoin de diviser ligne par ligne pour ça.

  13. #13
    Membre régulier Avatar de Mr.Robot12
    Homme Profil pro
    Étudiant
    Inscrit en
    Mai 2016
    Messages
    189
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Mai 2016
    Messages : 189
    Points : 81
    Points
    81
    Par défaut
    disant que je prends le bloc de 3 sections avec la regex. ensuite je suis comme même obligé de lire ligne par ligne pour extraire les bonnes données pour mettre dans la bonne propriété d'objet non ?
    désolé si vous avez l'impression de vous répéter j'essaie juste de comprendre

  14. #14
    Expert éminent sénior
    Avatar de tchize_
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Avril 2007
    Messages
    25 482
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 45
    Localisation : Belgique

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Avril 2007
    Messages : 25 482
    Points : 48 804
    Points
    48 804
    Par défaut
    Pour donner un exemple


    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    ========== Section 1 ============
    Truc: muche
    Bidule: bazar
    ========== Section 2 ============
    lorem
    ipsum dolor
    blabla on connait la chanson
    ========== Section 3 ============
    machin: muche
    chouette: yoloooo
    =============================

    peut être matché avec une regexp du genre

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    ========== Section 1 ============\nTruc: ([^\n]*)\nBidule: ([^\n]*)========== Section 2 ============(.*)========== Section 3 ============\nmachin: ([^\n]*)\nchouette:([^\n]*)\n=============================
    et t'aura muche, bazar, lorem etc, muche et yolo respectivement dans les groupe 1 2 3 et 4 du matcher.

  15. #15
    Membre régulier Avatar de Mr.Robot12
    Homme Profil pro
    Étudiant
    Inscrit en
    Mai 2016
    Messages
    189
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Mai 2016
    Messages : 189
    Points : 81
    Points
    81
    Par défaut
    avec la regex le temps de traitement sera réduite ? (plus rapide qu'avec buffered reader ?)

  16. #16
    Expert éminent sénior
    Avatar de tchize_
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Avril 2007
    Messages
    25 482
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 45
    Localisation : Belgique

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Avril 2007
    Messages : 25 482
    Points : 48 804
    Points
    48 804
    Par défaut
    Ben fait tes mesures

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

Discussions similaires

  1. Réponses: 2
    Dernier message: 08/06/2009, 15h46
  2. Réponses: 3
    Dernier message: 21/01/2009, 23h47
  3. Réponses: 2
    Dernier message: 10/07/2008, 13h29
  4. [HTML] quelle est la meilleure méthode pour changer la langue d'un site?
    Par poupouille dans le forum Balisage (X)HTML et validation W3C
    Réponses: 2
    Dernier message: 18/02/2008, 13h17
  5. Réponses: 20
    Dernier message: 27/06/2006, 18h42

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