2013-01-16 1 views
1

Dans tous les exemples que tout le monde peut trouver le code comme ceci:DataInputStream qui ferment flux si IOException

DataInputStream inputStream = null; 
try { 
    inputStream = new DataInputStream(new FileInputStream("file.data")); 
    int i = inputStream.readInt(); 
    inputStream.close(); 
} catch (FileNotFoundException e) { 
    //print message File not found 
} catch (IOException e) { e.printStackTrace() } 

Lorsque ce code a rencontré FileNotFound exception, inputStream n'a pas été ouverte, donc il n'a pas besoin d'être fermé.

Mais pourquoi quand IOException mets dans ce bloc catch je ne vois pas inputStream.close(). Cette opération est-elle effectuée automatiquement lorsque l'exception de données d'entrée est lancée? Parce que si le programme a un problème avec l'entrée, cela signifie que ce flux est déjà ouvert.

Répondre

2

Non, l'opération de fermeture ne se déclenche pas automatiquement. A ces fins utilisent try-with-resources introduit dans Java 7:

try (DataInputStream inputStream = new DataInputStream(new FileInputStream("file.data"))) { 
    int i = inputStream.readInt(); 
} catch (Exception e) { e.printStackTrace() }  

UPD: Explication: DataInputStream implémente l'interface AutoCloseable. Cela signifie que, dans la construction try-with-resources Java appellera automatiquement close() méthode de inputStream dans le bloc finalement caché.

+0

que voulez-vous dire "try-catch-with-resources" introduit dans Java7? dans votre partie de code, je ne vois pas l'opérateur inputStream.close(). vous voulez laisser la fermeture de Java? –

+2

@LesyaMakhova Je vous suggère de lire sur cette construction ici: http://docs.oracle.com/javase/tutorial/essential/exceptions/tryResourceClose.html – Andremoniy

+0

merci beaucoup. C'est la meilleure solution! –

2
DataInputStream inputStream = null; 
try { 
    inputStream = new DataInputStream(new FileInputStream("file.data")); 
    int i = inputStream.readInt(); 
} catch (FileNotFoundException e) { 
    //print message File not found 
} catch (IOException e) { 
    e.printStackTrace(); 
} finally{ 
    if(null!=inputStream) 
    inputStream.close(); 
} 
2

Même si l'exception de fichier non trouvé se produit, la vapeur est ouverte, vous devez simplement la fermer à nouveau.

Vous devriez toujours ajouter un bloc finally dans votre try catch et fermer le flux. Enfin exécutera toujours s'il y a une exception

finally { 
      if(reader != null){ 
       try { 
        reader.close(); 
       } catch (IOException e) { 
        //do something clever with the exception 
       } 
      } 
      System.out.println("--- File End ---"); 
     } 
Questions connexes