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 :

[(re)débutant] ecrire un fichier a partir d'un InputStream


Sujet :

Entrée/Sortie Java

  1. #1
    Membre éclairé Avatar de Biosox
    Profil pro
    Inscrit en
    Mai 2005
    Messages
    298
    Détails du profil
    Informations personnelles :
    Localisation : Suisse

    Informations forums :
    Inscription : Mai 2005
    Messages : 298
    Par défaut [(re)débutant] ecrire un fichier a partir d'un InputStream
    Hello,

    ça fait trop longtemps que j'ai pas fait du java et je suis un peu perdu.

    Je dois écrire une fonction saveFile(String fileName, InputStream, is).
    Je pense que tout le monde comprend ce que cette fonction doit faire.

    Seulement voila, j'y arrive pas. J'imagine bien que je dois attaquer le problème a grand coups de BufferedReader et de FileOutputStream mais je sais pas comment.

    voila plus ou moins comment je compte faire:
    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
     private void saveFile(String fileName, InputStream is)
    	  {
    		  System.out.println("Saving file: "+fileName);
    		  try
    		  {
    			  BufferedReader br = new BufferedReader(new InputStreamReader(is));
    			  FileOutputStream fos = new FileOutputStream(fileName);
     
     
    			  while( ????? )
                              {
    			    int i = br.read();
    			    fos.write(i);
                              }
    		  }
    		  catch(IOException e)
    		  {
    			  e.printStackTrace();
    		  }
    	  }
    Mais d'une part je sais pas comment tester la fin de la lecture, et d'autre part il me semble pas très performant d'y aller byte par byte...

    Quelqu'un a une suggestion?
    Merci

  2. #2
    Expert éminent
    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
    Billets dans le blog
    1
    Par défaut
    Salut,

    Citation Envoyé par Biosox Voir le message
    Mais d'une part je sais pas comment tester la fin de la lecture,
    Il suffit de surveiller la valeur renvoyé par read() : une valeur négative signale la fin du fichier...

    Citation Envoyé par Biosox Voir le message
    et d'autre part il me semble pas très performant d'y aller byte par byte...
    Si tu utilises des BufferedReader/Writer cela n'est pas trop dommageable mais il vaut mieux utiliser directement un buffer...

    Sinon quelques petit problème que je détecte dans ton code :
    • Tu ne fermes pas le fichier que tu ouvres (pas bien !). Et attention car l'InputStream reçu en paramètre devra être fermé par la méthode appelante !!!
    • Tu utilises un Reader d'un coté (char) et un Stream de l'autre (byte) : tu risques d'avoir plein de problème de conversion.
    • Autant utiliser des Stream des deux cotés et avoir une copie parfaite !
    • Et comme tu l'as dit la copie byte à byte c'est pas le top : un buffer serait préférable

    Ce qui donnerais :
    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
    	private void saveFile(String fileName, InputStream is) {
    		System.out.println("Saving file: " + fileName);
     
    		try {
    			FileOutputStream fos = new FileOutputStream(fileName);
    			try {
    				// On utilise un tableau comme buffer
    				byte[] buf = new byte[8192];
    				// Et on utilise une variable pour connaitre le nombre
    				// de bytes lus, et donc le nombres qu'il faudra écrire :
    				int len;
     
    				while ( ( len = is.read(buf)) >= 0 ) {
    					fos.write(buf, 0, len);
    				}
    			} finally {
    				// On ferme le fichier quoi qu'il arrive :
    				fos.close();
    			}
    		} catch (IOException e) {
    			e.printStackTrace();
    		}
    	}
    Qu'il faudra appeler comme cela :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    InputStream in = ...
    try {
        saveFile("nom.ext", in);
    } finally {
        in.close();
    }

    Mais perso plutôt que de catcher l'exception je la ferais remonter, ce qui fait qu'on ne peut pas déterminer programmatiquement si la méthode a fonctionné ou pas :
    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
    	private void saveFile(String fileName, InputStream is) throws IOException, FileNotFoundException {
    		System.out.println("Saving file: " + fileName);
     
    		FileOutputStream fos = new FileOutputStream(fileName);
    		try {
    			// On utilise un tableau comme buffer
    			byte[] buf = new byte[8192];
    			// Et on utilise une variable pour connaitre le nombre
    			// de bytes lus, et donc le nombres qu'il faudra écrire :
    			int len;
     
    			while ((len = is.read(buf)) >= 0) {
    				fos.write(buf, 0, len);
    			}
    		} finally {
    			// On ferme le fichier quoi qu'il arrive :
    			fos.close();
    		}
    	}
    a++

  3. #3
    Membre éclairé Avatar de Biosox
    Profil pro
    Inscrit en
    Mai 2005
    Messages
    298
    Détails du profil
    Informations personnelles :
    Localisation : Suisse

    Informations forums :
    Inscription : Mai 2005
    Messages : 298
    Par défaut
    Merci beaucoup pour ces explications.
    Effectivement, j'ai encore pas mal de chose à apprendre en ce qui concerne le traitement des exception

    J'ai testé le code que tu m'as proposé, il marche à merveille, merci!

    J'avais un vague souvenir que pour écrire dans un fichier j'avais a tout prix besoin d'un BufferedReader et du coup je ne voyais pas plus loin que le bout de mon nez.

Discussions similaires

  1. Réponses: 14
    Dernier message: 02/10/2014, 18h15
  2. Ecrire un fichier xml à partir d'une dtd
    Par almaje dans le forum Général Python
    Réponses: 3
    Dernier message: 12/11/2012, 08h46
  3. [débutant] travail sur fichiers excel à partir de vb.net
    Par ozthewizard dans le forum ADO.NET
    Réponses: 0
    Dernier message: 19/09/2011, 11h25
  4. Ecrire un fichier txt à partir d'un autre
    Par Cirrus dans le forum VBA Access
    Réponses: 9
    Dernier message: 17/06/2008, 15h13
  5. Ecrire un fichiers CSV à partir de 3 fichiers Excel
    Par yas2006 dans le forum Documents
    Réponses: 22
    Dernier message: 14/03/2006, 14h10

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