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 :

Problème de lecture d'un gros fichier .txt depuis une URL


Sujet :

Entrée/Sortie Java

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre éclairé
    Homme Profil pro
    Data Scientist
    Inscrit en
    Février 2017
    Messages
    28
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 33
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Data Scientist

    Informations forums :
    Inscription : Février 2017
    Messages : 28
    Par défaut Problème de lecture d'un gros fichier .txt depuis une URL
    Bonjour à tous. Étant débutant en Java, je me permets de solliciter votre aide.

    En fait mon problème est assez étrange, je ne le comprends pas vraiment. Mon but est de me construire une ArrayList contenant une liste quasi exhaustive des mots de la langue française.

    Pour ça j'utilise cette URL qui contient environ 310 000 mots (c'est la plus complète que j'ai trouvée) :
    https://raw.githubusercontent.com/mm...cais.frgut.txt

    Ma classe Mots qui contient ma méthode de lecture d'un fichier depuis une URL et qui me ressort une ArrayList de chacune des lignes de celui-ci :

    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
    import java.io.BufferedReader;
    import java.io.IOException;
    import java.io.InputStream;
    import java.io.InputStreamReader;
    import java.net.URL;
    import java.util.ArrayList;
     
    public class Mots {
     
        public ArrayList<String> readFile(String monUrl) throws IOException {
     
            ArrayList<String> listMots = new ArrayList<>();
            URL url = new URL(monUrl);
     
            InputStream inputStream = url.openStream();
            InputStreamReader inputStreamReader = new InputStreamReader(inputStream, "UTF-8");
            BufferedReader buffer = new BufferedReader(inputStreamReader);
     
            while (buffer.ready()) {
                String mot = buffer.readLine();
                listMots.add(mot);
            }
     
            return listMots;
        }
    }
    Ma classe Main qui me sert à tester mes différentes méthodes :

    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
    import java.io.IOException;
    import java.util.ArrayList;
     
    public class AppTest {
     
        public static void main(String[] args) {
     
            String urlMots = "https://raw.githubusercontent.com/mmai/chiensuperieur/master/dictionnaires/liste.de.mots.francais.frgut.txt";
            Mots m = new Mots();
            ArrayList<String> mots = new ArrayList<>();
     
            try {
                mots = m.readFile(urlMots);
            } catch (IOException e) {
                e.printStackTrace();
            }
     
            for(String mot : mots)
                 System.out.println(mot);
     
            System.out.println("\n" + mots.size() +" mots lus");
        }
     
    }
    Et là j'ai un gros problème. Ma méthode marche bien (les mots de l'URL arrivent bien dans mon ArrayList mots), mais sauf qu'elle s'arrête au bout d'un moment. Un coup je compile et mon ArrayList est de taille 416, un coup elle est de taille 29 000 et quelques, un autre coup elle est de taille 1500 ...

    Bref, mon ArrayList n'est jamais de la taille attendue, elle ne contient jamais mes 310 000 mots comme dans le fichier texte présenté plus haut

    Est-ce que vous savez comment régler ce problème ? Et est-ce que quand vous lancez mon petit programme, votre liste se construit bien et arrive jusqu'au bout du .txt ? Car je me dis que ça vient peut être de mon garbage collector qui capte rien avec une liste aussi énorme.

    Merci d'avance et bonne fin de journée.

    A noter que j'ai tenté avec un objet HashSet (mieux adapté aux listes de grandes tailles) au lieu d'une ArrayList et j'ai toujours ce même problème

  2. #2
    Membre éclairé
    Homme Profil pro
    Data Scientist
    Inscrit en
    Février 2017
    Messages
    28
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 33
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Data Scientist

    Informations forums :
    Inscription : Février 2017
    Messages : 28
    Par défaut
    Bon bah du coup j'ai réussi à régler le problème en me construisant un fichier .txt en local et en y important manuellement tous les mots du fichier de l'URL (avec un bon vieux Ctrl + A, Ctrl + C, Ctrl + V des familles).

    Du coup j'ai construit cette méthode un peu similaire qui prend en paramètre un objet File et qui me ressort une ArrayList.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    public ArrayList<String> readFile(File file) throws IOException {
    	ArrayList<String> listMots = new ArrayList<>();
    	FileReader fis = new FileReader(file);
    	BufferedReader br = new BufferedReader(fis);
     
    	while (br.ready()) {
    		String mot = br.readLine();
    		listMots.add(mot);
    	}
    	return listMots;
    }
    J'ai le résultat attendu (mes 330 000 mots dans mon ArrayList) mais je ne comprends toujours pas pourquoi ça ne marchait pas avec l'URL (qui était mon but de départ)

  3. #3
    Membre Expert
    Homme Profil pro
    Inscrit en
    Septembre 2006
    Messages
    2 963
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations forums :
    Inscription : Septembre 2006
    Messages : 2 963
    Par défaut
    Citation Envoyé par DeepLearning Voir le message
    J'ai le résultat attendu (mes 330 000 mots dans mon ArrayList) mais je ne comprends toujours pas pourquoi ça ne marchait pas avec l'URL (qui était mon but de départ)
    Returns true if the next read() is guaranteed not to block for input, false otherwise. Note that returning false does not guarantee that the next read will block.


    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    String mot ;
    while ((mot = br.readLine()) != null) {
            listMots.add(mot);
    }

  4. #4
    Modérateur
    Avatar de joel.drigo
    Homme Profil pro
    Ingénieur R&D - Développeur Java
    Inscrit en
    Septembre 2009
    Messages
    12 430
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 56
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Ingénieur R&D - Développeur Java
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2009
    Messages : 12 430
    Billets dans le blog
    2
    Par défaut
    On aurait pu faire aussi :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    public List<String> readFile(String monUrl) throws IOException {
     
        URL url = new URL(monUrl);
     
        try (InputStream inputStream = url.openStream();
             InputStreamReader inputStreamReader = new InputStreamReader(inputStream, "UTF-8");
             BufferedReader buffer = new BufferedReader(inputStreamReader)) {
     
             return buffer.lines().collect(Collectors.toList());
        }
     
    }
    L'expression "ça marche pas" ne veut rien dire. Indiquez l'erreur, et/ou les comportements attendus et obtenus, et donnez un Exemple Complet Minimal qui permet de reproduire le problème.
    La plupart des réponses à vos questions sont déjà dans les FAQs ou les Tutoriels, ou peut-être dans une autre discussion : utilisez la recherche interne.
    Des questions sur Java : consultez le Forum Java. Des questions sur l'EDI Eclipse ou la plateforme Eclipse RCP : consultez le Forum Eclipse.
    Une question correctement posée et rédigée et vous aurez plus de chances de réponses adaptées et rapides.
    N'oubliez pas de mettre vos extraits de code entre balises CODE (Voir Mode d'emploi de l'éditeur de messages).
    Nouveau sur le forum ? Consultez Les Règles du Club.

  5. #5
    Membre éclairé
    Homme Profil pro
    Data Scientist
    Inscrit en
    Février 2017
    Messages
    28
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 33
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Data Scientist

    Informations forums :
    Inscription : Février 2017
    Messages : 28
    Par défaut
    Merci beaucoup pour vos réponses. En fait j'avais déjà trouvé pour le problème de l'URL avant de lire les réponses, et effectivement j'étais arrivé à la conclusion que ma boucle while devait plutôt être de cette forme :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    String line;
    while ((line = buffer.readLine()) != null) {
    	listMots.add(line);
    }
    Et un grand merci monsieur le modo pour la solution, c'est encore mieux. Je suis toujours très content d'éviter les boucles
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    return buffer.lines().collect(Collectors.toList());
    Merci à vous et bonne fin de soirée.

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

Discussions similaires

  1. [WD18] Obtenir fichier csv depuis une url
    Par lerorodu51 dans le forum WinDev
    Réponses: 4
    Dernier message: 10/01/2014, 14h48
  2. Problème de lecture/ecriture dans un fichier txt
    Par fraid49 dans le forum Général Python
    Réponses: 6
    Dernier message: 20/11/2008, 11h32
  3. Réponses: 2
    Dernier message: 16/07/2008, 22h32
  4. Réponses: 1
    Dernier message: 03/06/2008, 14h47
  5. [VBA-E]Créer un fichier txt depuis une feuille Excel
    Par marie10 dans le forum Macros et VBA Excel
    Réponses: 9
    Dernier message: 20/02/2006, 17h36

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