FileOutputStream: La méthode “close” appelle-t-elle également “flush”?

Je suis vraiment confus au sujet de la méthode flush et close. Dans mon code, je ferme toujours mon object FileOutputStream . Mais je veux savoir que si je dois utiliser la méthode flush ici, et où puis-je l’utiliser?

Je vais écrire un projet qui télécharge 4 ou 5 fichiers à plusieurs resockets. Je vais écrire une méthode (pour télécharger des fichiers) et ma méthode sera dans une boucle et télécharger des fichiers à plusieurs resockets. Ma méthode aura un code comme celui-ci.

La méthode close appelle-t-elle flush ou dois-je utiliser flush avant de fermer?

 try { InputStream inputStream = con.getInputStream(); FileOutputStream outputStream = new FileOutputStream("C:\\programs\\TRYFILE.csv"); int bytesRead = -1; byte[] buffer = new byte[4096]; while ((bytesRead = inputStream.read(buffer)) != -1) { outputStream.write(buffer, 0, bytesRead); } } catch(Exception e) { // } finally { outputStream.close(); inputStream.close(); } 

Notez que le code fonctionne bien: il télécharge le fichier avec succès. Mais je ne suis pas sûr d’utiliser la flush .

    La méthode flush est utilisée pour “vider” les octets conservés dans une mémoire tampon. FileOutputStream n’utilise aucun tampon, la méthode flush est donc vide. L’appeler ou pas ne change pas le résultat de votre code.

    Avec les rédacteurs en mémoire tampon, l’appel de méthode close se fait explicitement.

    Vous devez donc appeler flush lorsque vous souhaitez écrire les données avant de fermer le stream et avant que la mémoire tampon ne soit saturée (lorsque la mémoire tampon est saturée, le graveur commence à écrire sans attendre un appel flush).

    Le code source de la classe FileOutputStream n’a pas de version personnalisée de méthode flush . La méthode flush utilisée est donc la version de sa super classe OutputStream . Le code de flush dans OutputStream est le suivant

     public void flush() throws IOException { } 

    Comme vous le voyez, il s’agit d’une méthode vide ne faisant rien, elle est donc identique à l’appeler ou non.

    Je vais écrire un projet qui télécharge 4 ou 5 fichiers à plusieurs resockets. Je vais écrire une méthode (pour télécharger des fichiers) et ma méthode sera dans une boucle et télécharger des fichiers à plusieurs resockets. Ma méthode aura un code comme celui-ci.

    La méthode close appelle-t-elle flush ou dois-je utiliser flush avant de fermer?

    Je recommande d’utiliser l’API NIO.2 et l’instruction try-with-resources. Cela réduira la quantité de code et assurera le vidage et la fermeture des stream:

     try (InputStream inputStream = con.getInputStream()){ Files.copy(inputStream, Paths.get("C:\\programs\\TRYFILE.csv")); } 

    Le sujet est un peu déroutant, car OutputStream.close ne nécessite pas de vidage automatique, mais les sous-classes peuvent le spécifier. Ils pourraient également fournir une méthode de vidage qui ne fait rien (par exemple, comme celle héritée de OutputStream, comme dans le cas de FileOutputStream). Dans ce cas, l’appel de la méthode de vidage n’a aucun effet, vous pouvez donc l’omettre.

    En cas de doute (si vous ne savez pas avec quelle sous-classe vous travaillez), je suppose qu’il est préférable d’appeler la couleur manuellement.

    Mais encore une fois, en utilisant le code ci-dessus, on prend soin de vous.