Lorsque vous utilisez le FileLock de Java, est-il possible de laisser close () faire automatiquement un lock.release ()?
Question
Comme la plupart des gens le savent, close ()
ferme également toutes les utilisations de flux.
Ceci permet au code suivant:
BufferedReader br = new BufferedReader(new InputStreamReader(new FileInputStream(...)));
...
br.close();
C’est bien, car nous n’avons pas besoin d’une référence à FileInputStream
et n’oubliez pas de le fermer.
Mais cela fonctionne-t-il également pour FileLock
s?
final FileInputStream fis = new FileInputStream(new File("buffer.txt"));
final FileChannel c = fis.getChannel();
final FileLock lock = c.lock(0L, Long.MAX_VALUE, true);
final BufferedReader br = new BufferedReader(new InputStreamReader(fis));
try {
while(br.ready()) {
System.out.println(br.readLine());
}
} finally {
br.close();
}
J'ai essayé ce code et le verrou est correctement relâché lorsque br.close ()
est appelé, mais est-il sécuritaire de le faire? Le dit JavaDoc pouvant être fermé , "Ferme ce flux et libère les ressources système qui lui sont associées." Suis-je sûr de supposer que j'utilise close ()
comme spécifié dans ()
le verrou?
La solution
Selon le JavaDoc . :
Il reste valide jusqu'à ce que le verrou soit libéré en invoquant la libération méthode, en fermant le canal qui a été utilisé pour l'acquérir, ou par le terminaison du virtuel Java machine, selon la première éventualité.
Et voici le contenu de FileInputStream.close ()
public void close() throws IOException {
if (channel != null)
channel.close();
close0();
}
Il semble que close
sur le flux ferme le canal qui libère le verrou.
Autres conseils
Oui.
Les verrous dépendent d'un descripteur de fichier. Lorsqu'il n'y a pas de descripteur de fichier représentant un fichier dans un processus, aucun verrou ne lui est associé.