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 :

Copier un fichier *.txt dans une string


Sujet :

Entrée/Sortie Java

  1. #1
    Membre habitué
    Profil pro
    Inscrit en
    Février 2007
    Messages
    190
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2007
    Messages : 190
    Points : 153
    Points
    153
    Par défaut Copier un fichier *.txt dans une string
    Salut,

    J'ai fichier *.txt et je voudrais récupérrer son contenu dans une chaine de carractéres. Le problème est très simple mais j'ai pas trouvé d'autre solution que de faire une copie carractère par carractère:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
     
    String myFile = ".\\file.txt";
     
    StringBuilder myString = new StringBuilder();
     
    FileReader reader = new FileReader(myFile);
    int c;
    while((c = reader.read()) != -1)
    {
    	myString.append((char)c);
    }
    Comment auriez-vous fait?
    Merci

  2. #2
    Membre régulier
    Homme Profil pro
    Chef de projet NTIC
    Inscrit en
    Juin 2007
    Messages
    70
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Nord (Nord Pas de Calais)

    Informations professionnelles :
    Activité : Chef de projet NTIC
    Secteur : Administration - Collectivité locale

    Informations forums :
    Inscription : Juin 2007
    Messages : 70
    Points : 82
    Points
    82
    Par défaut
    Salut LGnord !

    En fait je n'aurais pas fait différemment sauf que j'aurais lu ligne par ligne mon fichier.

  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,


    Perso je vois quelques problèmes :
    • Le fichier n'est pas refermé (lire FAQ !)
    • Lecture caractère par caractère, et donc avec tout plein dopération d'E/S inutilement. Hors les E/S sont très couteuse...
      Une lecture par ligne serait mieux, mais une par bloc serait encore mieux.
    • Pas de possibilité de spécifier un encodage (ce qui est source de multiple problème)



    J'aurais plutôt codé cela comme ceci :
    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
    	public static String readFile(String fileName, Charset charset) throws IOException {
    		// Si le charset n'est pas spécifié
    		if (charset==null) {
    			// on utilise celui par défaut du système :
    			charset = Charset.defaultCharset();
    		}
     
    		// On ouvre le fichier avec un InputStreamReader/FileInputStream
    		// Ce qui permet de spécifier un encodage :
    		final Reader reader = new InputStreamReader(new FileInputStream(fileName), charset);
    		try {
    			// On utilise un buffer pour la copie par bloc :
    			char[] cbuf = new char[8192];
    			// On crée le buffer qui contiendra le résultat :
    			final StringBuilder result = new StringBuilder();
    			// Nombre de caractère lu :
    			int len; 
     
    			// boucle de lecture :
    			while ( (len=reader.read(cbuf)) >+ 0 ) {
    				// On copie ce qu'on a lu :
    				result.append(cbuf, 0, len);
    			}
     
    			return result.toString();
    		} finally {
    			// Dans tous les cas, on ferme le fichier :
    			reader.close();
    		}
    	}

    a++

  4. #4
    Membre habitué
    Profil pro
    Inscrit en
    Février 2007
    Messages
    190
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2007
    Messages : 190
    Points : 153
    Points
    153
    Par défaut
    Merci pour vos propositions.

    * Le fichier n'est pas refermé (lire FAQ !)
    Très gros oubli de ma part.

    * Lecture caractère par caractère, et donc avec tout plein dopération d'E/S inutilement. Hors les E/S sont très couteuse...
    Une lecture par ligne serait mieux, mais une par bloc serait encore mieux.
    Le sens de ma question était bien là. Je ne connais pas la lecture par block. Je vais aller voir.

    * Pas de possibilité de spécifier un encodage (ce qui est source de multiple problème)
    Mouais. Je me sens déjà moins concerné.

    Si je comprends bien ton code, tu lis par bloc de 8192 caractères. Pourquoi 8192?

    Je vais aussi me renseigner sur le Charset (si je prends ton code tel qu'il est, je vais mettre null).

    Au final, il faut quand même 20 lignes de code pour un truc tout simple.

  5. #5
    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 LGnord Voir le message
    Si je comprends bien ton code, tu lis par bloc de 8192 caractères. Pourquoi 8192?
    C'est une valeur que je prend en général, et qui me semble correspondre à un bon compromis (et multiple de 8 / même si je ne pense pas que cela ait une importance).

    Si tu lis un fichiers de 100Ko, avec ton code cela va représenter 100 000 appels systèmes d'E/S (un par caractère).
    Avec une lecture par bloc de 8192 on peut tomber à 13 appels d'E/S au minimum (rien ne garantie que tout le bloc soit lu, même si c'est généralement le cas depuis un disque dur).

    Pour des fichiers textes c'est largement suffisant. En l'augmentant tu peux peut-être améliorer les performances mais la différence ne doit être réelle que sur de très gros fichier...

    Citation Envoyé par LGnord Voir le message
    Je vais aussi me renseigner sur le Charset (si je prends ton code tel qu'il est, je vais mettre null).
    En règle général lorsqu'on lit un fichier texte il faut connaitre son encodage. Le fait de ne pas le préciser est une facilité qui peut poser problème (tout comme précisé un mauvais encodage).

    Tant qu'à se faire une méthode de lecture autant gérer cela ce n'est pas bien méchant...

    Citation Envoyé par LGnord Voir le message
    Au final, il faut quand même 20 lignes de code pour un truc tout simple.
    Si tu enlèves les commentaires et la partie sur le Charset, ce n'est pas beaucoup plus long...


    a++

  6. #6
    Membre habitué
    Profil pro
    Inscrit en
    Février 2007
    Messages
    190
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2007
    Messages : 190
    Points : 153
    Points
    153
    Par défaut
    Merci pour ces précissions.

    J'ai pris en compte tes remarques et tout se passe bien.

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

Discussions similaires

  1. importer un fichier .txt dans une table
    Par caracas dans le forum Administration
    Réponses: 2
    Dernier message: 31/07/2007, 21h19
  2. [DDE]Import fichier .txt dans une base Access
    Par stoonman dans le forum Access
    Réponses: 3
    Dernier message: 23/03/2007, 19h08
  3. Réponses: 8
    Dernier message: 28/12/2006, 14h18
  4. importation d'un fichier txt dans une table
    Par pierre.egaud dans le forum MS SQL Server
    Réponses: 2
    Dernier message: 06/09/2006, 16h26
  5. ligne de fichier txt dans une variable
    Par suya95 dans le forum Langage
    Réponses: 2
    Dernier message: 25/07/2006, 10h14

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