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 :

Java.io -> fermer les flux.


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
    Consultant informatique
    Inscrit en
    Septembre 2006
    Messages
    572
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Consultant informatique

    Informations forums :
    Inscription : Septembre 2006
    Messages : 572
    Par défaut Java.io -> fermer les flux.
    Bonjour,

    J'ai un doute sur la fonction close() des flux de java.io.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
     
    // DECS
    BufferedReader br = null;
    FileInputStream fis = null;
    InputStreamReader isr = null;
     
    // OUVERTURE
    fis = new FileInputStream(file);
    isr = new InputStreamReader(fis, "UTF-16");
    br = new BufferedReader(isr);
    Comment je dois fermer les flux ?
    Si je ferme br, est ce que ça va tout fermer en cascade ?
    Si je ferme fis en premier, est ce que ça pas faire sauter les deux autres ?

    Pour l'instant je fais comme ça :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    br.close();
    isr.close();
    fis.close();
    Est ce utile ? Est ce que l'ordre est important ?

    Bref, en gros, j'aimerais plus de détails sur cette phase.

    Merci d'avance

  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,



    L'ordre est important en particulier si tu utilises des flux bufférisé. Ainsi par exemple une BufferedWriter pourra écrire ses dernières données juste avant la fermeture...
    Il faut donc fermer les flux dans l'ordre inverse de leurs ouverture.


    Mais heureusement il est possible d'encapsuler les flux et de ne fermer que le dernier (le flux englobé sera fermé lorsqu'on ferme le conteneur, etc.) :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    	BufferedReader br =  new BufferedReader(
    			new InputStreamReader(new FileInputStream(file), "UTF-16") );
    Par contre il faut toujours utilisé un bloc finally pour fermer le flux, même en cas d'exception :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    	BufferedReader br =  new BufferedReader(
    			new InputStreamReader(new FileInputStream(file), "UTF-16") );
    	try {
    		// Traitements
    	} finally {
    		br.close();
    	}
    Comment libérer proprement les ressources ?

    a++

  3. #3
    Membre éclairé
    Homme Profil pro
    Consultant informatique
    Inscrit en
    Septembre 2006
    Messages
    572
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Consultant informatique

    Informations forums :
    Inscription : Septembre 2006
    Messages : 572
    Par défaut
    Citation Envoyé par adiGuba Voir le message
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    	BufferedReader br =  new BufferedReader(
    			new InputStreamReader(new FileInputStream(file), "UTF-16") );
    Ah, j'étais justement persuadé que cette écriture était mauvaise, et qu'il fallait garder un pointeur sur chaque flux pour les fermer à la main.

    Du coup, on va pas s'embeter.

  4. #4
    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
    Citation Envoyé par Faiche Voir le message
    Ah, j'étais justement persuadé que cette écriture était mauvaise, et qu'il fallait garder un pointeur sur chaque flux pour les fermer à la main.
    Le seul cas où il est obligatoire se séparer les flux c'est lorsque la création d'un flux peut échoué et remonter une exception. A ma connaissance c'est seulement le cas pour les ObjectInputStream/ObjectOutputStream...

    a++

  5. #5
    Membre expérimenté
    Profil pro
    Inscrit en
    Septembre 2007
    Messages
    282
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2007
    Messages : 282
    Par défaut
    Eh bah j'ai encore appris un truc, jusque là je me basais sur les réponses d'adiGuba pour mes flux, maintenant je sais pourquoi ça marche aussi, c'est l'encapsulation ! magie

Discussions similaires

  1. Trouver/fermer tous les flux d'un fichier
    Par deathness dans le forum Eclipse Platform
    Réponses: 2
    Dernier message: 06/06/2013, 11h22
  2. Un lecteur de Streaming JAVA pour les flux OGG
    Par kmdkaci dans le forum Mon programme
    Réponses: 1
    Dernier message: 10/10/2011, 01h23
  3. [Java 5] Réflexion sur les énumérations type-safe
    Par rozwel dans le forum Langage
    Réponses: 5
    Dernier message: 04/12/2004, 20h34

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