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 :

Optimiser le stockage d'un fichier dans un String


Sujet :

Entrée/Sortie Java

  1. #1
    Membre actif
    Profil pro
    Inscrit en
    Avril 2010
    Messages
    294
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2010
    Messages : 294
    Points : 268
    Points
    268
    Par défaut Optimiser le stockage d'un fichier dans un String
    Bonjour,

    J'ai besoin de stocker un fichier texte dans un String, voici le code que j'utilise:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    String monString = new String();
    Scanner sc = new Scanner(new File("monFichier"));
    while(sc.hasNext()){
      monString = monString + sc.nextLine() + "\n";
    }
    Mais le souci c'est que le fichier que je dois traiter fait plusieurs dizaines de milliers de lignes. La compilation L'execution du code est donc très longue!

    Connaissez vous un moyen d'optimiser cela?

    Merci d'avance

  2. #2
    Membre averti
    Homme Profil pro
    Développeur Java
    Inscrit en
    Avril 2004
    Messages
    265
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations professionnelles :
    Activité : Développeur Java

    Informations forums :
    Inscription : Avril 2004
    Messages : 265
    Points : 342
    Points
    342
    Par défaut
    Citation Envoyé par tupac25 Voir le message
    La compilation du code est donc très longue!
    L’exécution, si c'est vraiment la compilation, le problème ne vient certainement pas de là.
    Sinon peut-être en faisant un truc de ce style :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
        byte[] buffer = new byte[(int) new File(filePath).length()];
        BufferedInputStream f = null;
        try {
            f = new BufferedInputStream(new FileInputStream(filePath));
            f.read(buffer);
        } finally {
            if (f != null) try { f.close(); } catch (IOException ignored) { }
        }
        return new String(buffer);
    Il y a aussi des choses pour faire ça dans apache commons je crois (mais je n'ai jamais testé).

  3. #3
    Expert éminent sénior
    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
    Points : 23 190
    Points
    23 190
    Billets dans le blog
    1
    Par défaut
    Salut,


    Ce n'est pas la compilation qui est longue... mais l'exécution !


    De plus pourquoi lire un fichier ligne par ligne alors que tu veux le récupérer en entier.

    Enfin ton erreur vient de la concaténation de chaine dans une boucle via l'opérateur +, qui implique la création d'une nouvelle chaine à chaque iteration ce qui implique la création de plusieurs objets temporaires...


    Il est préférable de passer par une lecture par bloc via un Reader, en spécifiant le charset de préférence.

    Par exemple :
    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
    	public static String read(File file) throws IOException {
    		return read(file, Charset.defaultCharset());
    	}
     
    	public static String read(File file, Charset charset) throws IOException {
    		InputStreamReader reader = new InputStreamReader(new FileInputStream(file), charset);
    		try {
    			StringBuilder sb = new StringBuilder((int)file.length());
    			char[] cbuf = new char[8192];
    			int len;
     
    			while ( (len=reader.read(cbuf)) >= 0 ) {
    				sb.append(cbuf, 0, len);
    			}
    			return sb.toString();
    		} finally {
    			reader.close();
    		}
    	}

    a++

  4. #4
    Expert éminent sénior
    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
    Points : 23 190
    Points
    23 190
    Billets dans le blog
    1
    Par défaut
    @gailuris : Attention car rien ne garantie que le read() lise la totalité du buffer ! Il est impératif de vérifier son retour et de passer par une boucle.

    a++

  5. #5
    Membre averti
    Homme Profil pro
    Développeur Java
    Inscrit en
    Avril 2004
    Messages
    265
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations professionnelles :
    Activité : Développeur Java

    Informations forums :
    Inscription : Avril 2004
    Messages : 265
    Points : 342
    Points
    342
    Par défaut
    Citation Envoyé par adiGuba Voir le message
    @gailuris : Attention car rien ne garantie que le read() lise la totalité du buffer ! Il est impératif de vérifier son retour et de passer par une boucle.
    Bien vu, merci (c'est un exemple trouvé sur le net et copié un peu trop vite)

  6. #6
    Membre actif
    Profil pro
    Inscrit en
    Avril 2010
    Messages
    294
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2010
    Messages : 294
    Points : 268
    Points
    268
    Par défaut
    J'ai corrigé mon erreur, en effet c'est bien de l'exécution que je parle.

    Tout d'abord merci de m'avoir répondu. Mais j'ai oublié de préciser que je réalise des traitements sur certaines lignes, ce qui m'oblige à lire le fichier ligne par ligne.

    Grace à votre aide j'ai trouvé la solution à mon problème! Merci!

    Voici mon code:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    String monString = new String();
    StringBuilder sb = new StringBuilder();
    Scanner sc = new Scanner(new File("monFichier"));
    while(sc.hasNext()){
      sb.append(sc.nextLine() + "\n");
    }
    monString = sb.toString();

  7. #7
    Expert éminent sénior
    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
    Points : 23 190
    Points
    23 190
    Billets dans le blog
    1
    Par défaut
    Citation Envoyé par tupac25 Voir le message
    Mais j'ai oublié de préciser que je réalise des traitements sur certaines lignes, ce qui m'oblige à lire le fichier ligne par ligne.
    Il n'y a aucun traitements sur ces lignes dans ton code. C'est normal ?

    Et il manque le try/finally pour le close...

    a++

  8. #8
    Membre actif
    Profil pro
    Inscrit en
    Avril 2010
    Messages
    294
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2010
    Messages : 294
    Points : 268
    Points
    268
    Par défaut
    Je n'ai pas mis le traitement que j'effectue sur les lignes dans mon post pour éviter de surcharger le code et d'aller directement à l'essentiel.

    @adiGuba: que veux tu dire par:
    Et il manque le try/finally pour le close...

  9. #9
    Expert éminent sénior
    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
    Points : 23 190
    Points
    23 190
    Billets dans le blog
    1
    Par défaut
    Citation Envoyé par tupac25 Voir le message
    Je n'ai pas mis le traitement que j'effectue sur les lignes dans mon post pour éviter de surcharger le code et d'aller directement à l'essentiel.
    Disons que si on ne sait pas ce que tu veux faire exactement, on risque de te donner de mauvaises pistes...


    Sinon pour le try/finally voir mon code ou la FAQ : Comment libérer proprement les ressources (ou comment utiliser proprement les bloc try/finally) ?


    a++

  10. #10
    Membre actif
    Profil pro
    Inscrit en
    Avril 2010
    Messages
    294
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2010
    Messages : 294
    Points : 268
    Points
    268
    Par défaut
    Merci pour votre aide!

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

Discussions similaires

  1. Temps du stockage d'un fichier dans le cloud
    Par foufou_24 dans le forum Entrée/Sortie
    Réponses: 9
    Dernier message: 05/11/2013, 14h00
  2. Réponses: 0
    Dernier message: 10/04/2013, 10h53
  3. Réponses: 6
    Dernier message: 04/12/2012, 16h42
  4. Stockage d'un Fichier dans la BD
    Par Tshesko1 dans le forum Langage
    Réponses: 3
    Dernier message: 14/09/2011, 11h12

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