Je suis en train d'apprendre Java et je ne trouve aucune bonne explication sur implements Closeable
les implements AutoCloseable
interfaces et.
Lorsque j'ai implémenté un interface Closeable
, mon IDE Eclipse a créé une méthode public void close() throws IOException
.
Je peux fermer le flux en utilisant pw.close();
sans l'interface. Mais je ne comprends pas comment je peux implémenter la close()
méthode en utilisant l'interface. Et quel est le but de cette interface?
J'aimerais aussi savoir: comment puis-je vérifier si IOstream
c'était vraiment fermé?
J'utilisais le code de base ci-dessous
import java.io.*;
public class IOtest implements AutoCloseable {
public static void main(String[] args) throws IOException {
File file = new File("C:\\test.txt");
PrintWriter pw = new PrintWriter(file);
System.out.println("file has been created");
pw.println("file has been created");
}
@Override
public void close() throws IOException {
}
Réponses:
Il me semble que vous n'êtes pas très familier avec les interfaces. Dans le code que vous avez publié, vous n'avez pas besoin de l'implémenter
AutoCloseable
.Vous devez seulement (ou devriez) implémenter
Closeable
ouAutoCloseable
si vous êtes sur le point d'implémenter le vôtrePrintWriter
, qui gère les fichiers ou toute autre ressource qui doit être fermée.Dans votre mise en œuvre, il suffit d'appeler
pw.close()
. Vous devriez le faire dans un bloc finally:Le code ci-dessus est lié à Java 6. Dans Java 7, cela peut être fait plus élégamment (voir cette réponse ).
la source
PrintWriter
? Surtout lesAutoClosable
objets peuvent être utilisés dans beaucoup plus de circonstances que justePrintWriter
s ...PrintWriter
donc je l'ai mentionné pour être plus précis.AutoCloseable
? Mieux vaut montrer un à latry-with-resources
place…AutoCloseable
(introduit dans Java 7) permet d'utiliser l' idiome try-with-resources :Maintenant, vous pouvez dire:
et JVM appellera
close()
automatiquement pour vous.Closeable
est une interface plus ancienne.Pour certaines raisonsPour préserver la compatibilité descendante, les concepteurs de langage ont décidé d'en créer un distinct. Cela permet non seulement d'utiliser toutes lesCloseable
classes (comme le lancement de fluxIOException
) dans try-with-resources, mais permet également de lancer des exceptions vérifiées plus générales à partir declose()
.En cas de doute, utilisez
AutoCloseable
, les utilisateurs de votre classe vous en seront reconnaissants.la source
Closeable.close()
jetteIOException
. Un grand nombre declose()
méthodes qui pourraient bénéficier de try-with-resources lancent d'autres exceptions vérifiées (par exemplejava.sql.Connection.close()
,AutoCloseable.close()
jette ainsiException
. La modification duCloseable
contrat existant casserait toutes les applications / bibliothèques existantes en se basant sur le contrat quiclose()
ne lève queIOException
et pas toutes les exceptions (vérifiées).Closeable.close()
doit être idempotent.AutoCloseable.close()
n'est pas, bien que cela soit toujours fortement recommandé.public void close( ) throws Exception
- utilisez une exception plus spécifique si vous le pouvez (par exemple, IOException)Closeable
ne garantit pas l' idempotence. Cela nécessite une idempotence dans l'implémentation de laclose()
méthode par un utilisateur . Et le fait que ceIOException
soit plus spécifique / approprié dépend du cas d'utilisation.Closeable
s'étendAutoCloseable
, et est spécifiquement dédié aux flux IO: il lance IOException au lieu d'Exception, et est idempotent, alors qu'AutoCloseable ne fournit pas cette garantie.Tout cela est expliqué dans le javadoc des deux interfaces.
L'implémentation d'AutoCloseable (ou Closeable) permet à une classe d'être utilisée comme ressource de la construction try-with-resources introduite dans Java 7, qui permet de fermer automatiquement ces ressources à la fin d'un bloc, sans avoir à ajouter un bloc finally qui se ferme la ressource explicitement.
Votre classe ne représente pas une ressource fermable, et il n'y a absolument aucun intérêt à implémenter cette interface: un IOTest ne peut pas être fermé. Il ne devrait même pas être possible de l'instancier, car il n'a aucune méthode d'instance. N'oubliez pas que l'implémentation d'une interface signifie qu'il existe une relation is-a entre la classe et l'interface. Vous n'avez pas une telle relation ici.
la source
Voici le petit exemple
Voici la sortie:
la source
this.close()
ou quelque chose dans le code?, Parce qu'il est appelé automatiquement. (Juste pour être sûr)La
try-with-resources
déclaration.Le
try-with-resources statement
est unetry
instruction qui déclare une ou plusieurs ressources. Aresource
est un objet qui doit être fermé une fois le programme terminé. Letry-with-resources statement
garantit que chaque ressource est fermée à la fin de l'instruction. Tout objet implémentantjava.lang.AutoCloseable
, qui comprend tous les objets implémentésjava.io.Closeable
, peut être utilisé comme ressource.L'exemple suivant lit la première ligne d'un fichier. Il utilise une instance de
BufferedReader
pour lire les données du fichier.BufferedReader
est une ressource qui doit être fermée une fois le programme terminé: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'interfacejava.lang.AutoCloseable
. Étant donné que l'BufferedReader
instance 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 (à la suite de laBufferedReader.readLine
génération d'unIOException
).Avant Java SE 7, vous pouvez utiliser un
finally
bloc pour vous assurer qu'une ressource est fermée, que l'instruction try se termine normalement ou brusquement. L'exemple suivant utilise unfinally
bloc au lieu d'unetry-with-resources
instruction:Veuillez vous référer à la documentation .
la source
Récemment, j'ai lu un livre Java SE 8 Programmer Guide ii.
J'ai trouvé quelque chose au sujet de la différence entre
AutoCloseable
vsCloseable
.L'
AutoCloseable
interface a été introduite dans Java 7. Avant cela, il existait une autre interface appeléeCloseable
. C'était similaire à ce que voulaient les concepteurs de langage, avec les exceptions suivantes:Closeable
restreint le type d'exception àIOException
.Closeable
exige que les implémentations soient idempotentes.Les concepteurs de langage mettent l'accent sur la compatibilité descendante. Comme le changement de l'interface existante n'était pas souhaitable, ils en ont créé une nouvelle appelée
AutoCloseable
. Cette nouvelle interface est moins stricte queCloseable
. PuisqueCloseable
répond aux exigences deAutoCloseable
, il a commencé à être mis en œuvreAutoCloseable
lorsque ce dernier a été introduit.la source
Closeable
", je suggérerais de dire "Cette nouvelle interface peut être utilisée dans des contextes plus généraux, où l'exception lancée lors de la fermeture n'est pas nécessairement une IOException". Dans l'univers Java, être "moins strict" a une ambiance négative à ce sujet.