2
votes

dois-je appeler close () sur chaque nouveau flux d'entrée?

voici le code.

public static void main(String[] args) throws IOException {

    FileInputStream fis = null;

    fis = new FileInputStream(new File("D:\\za180s.ser"));
    // do something
    fis = new FileInputStream(new File("D:\\za185s.ser"));
    // do something
    fis = new FileInputStream(new File("D:\\za186s.ser"));
    // do something
    fis = new FileInputStream(new File("D:\\za187s.ser"));
    // do something
    fis.close();

}

le problème est: dois-je appeler la méthode fis.close () après chaque "faire quelque chose" ou j'appelle juste fis.close () une fois après tout .

ignore si la position close () dans finally et le code doivent essayer catch ou non.

merci à tous.


5 commentaires

pourquoi utiliseriez-vous le même flux d'entrée pour tous les fichiers?


Oui, ils doivent tous être fermés. Vous pouvez utiliser les ressources try-with-resources de Java ( docs.oracle.com/ javase / tutorial / essential / exceptions /… ) pour ne pas avoir à fermer manuellement vos flux d'entrée.


Oui, vous devez les fermer. Vous pouvez utiliser la gestion automatique des ressources, c'est-à-dire la fonctionnalité essayer avec des ressources de Java 7


Les réponses ci-dessous (correctement) indiquent que vous devez le fermer, mais elles n'ont pas expliqué pourquoi . En général, ne pas fermer les flux d'entrée peut entraîner un épuisement des ressources .


comme il s'agit d'un fragment de code d'un ancien projet d'entreprise, il se bloque souvent car «mémoire insuffisante». il a besoin d'une optimisation de refactoring


3 Réponses :


8
votes

Oui, vous devez appeler close sur chaque InputStream . Le problème avec votre code est que vous réaffectez la variable fis chaque fois que vous créez un nouveau flux. En d'autres termes: fis ne pointe plus vers l'ancien InputStream , donc appeler close ne fermera pas le flux précédent.

Pour plus d'informations, cochez https://stackoverflow.com/a/40523/8819761

Ce que vous pouvez également faire est d'utiliser l'essai de Java 7. syntaxe with-resources, qui fermera automatiquement le flux une fois que vous aurez quitté le bloc try:

try (InputStream fis = new FileInputSteam(yourFile)) {
  // Do something
}

try (InputStream fis = new FileInputSteam(yourFile)) {
  // Do something else
}


1 commentaires

Merci ! ancien projet d'entreprise, basé sur java6. leader ne me laisse pas mettre à jour le jdk sur l'environnement de production.



0
votes

Vous devez fermer à chaque fois que vous avez fini de travailler avec InputStream.

En java, si vous attribuez

 fis = new FileInputStream(new File("D:\\za180s.ser"));

fis pointera vers le nouvel objet donc lorsque vous appelez fis.close () les anciens flux ne sont pas affectés. Et il n'y a aucun moyen de le fermer.


0 commentaires

0
votes

Vous devez appeler la méthode close à chaque fois, mais ne vous inquiétez pas maintenant. À partir de Java SE 7, vous pouvez utiliser try-with-resources . Selon Java-Oracle Doc,

L'instruction try-with-resources est une instruction try qui en déclare une ou plus de ressources. Une ressource est un objet qui doit être fermé après le programme en est terminé. La déclaration try-with-resources garantit que chaque ressource est fermée à la fin de l'instruction. Tout objet qui implémente java.lang.AutoCloseable, qui inclut tous Les objets qui implémentent java.io.Closeable peuvent être utilisés comme ressource.

Veuillez regarder l'exemple.

static String readFirstLineFromFile(String path) throws IOException {
    try (BufferedReader br =
                   new BufferedReader(new FileReader(path))) {
        return br.readLine();
    }
}

Dans cet exemple, la ressource déclarée dans l'instruction try-with-resources est un BufferedReader. L'instruction de déclaration apparaît entre parenthèses immédiatement après le mot-clé try. La classe BufferedReader, dans Java SE 7 et versions ultérieures, implémente l'interface java.lang.AutoCloseable. Étant donné que l'instance de BufferedReader est déclarée dans une instruction try-with-resource, elle sera fermée indépendamment du fait que l'instruction try se termine normalement ou brusquement (suite à la levée d'une IOException par la méthode BufferedReader.readLine).

Pour plus de détails, veuillez consulter la documentation Oracle-Java pour try-with-resources.

https://docs.oracle.com/javase/tutorial/essential/exceptions/tryResourceClose.html

p>


0 commentaires