Lorsque vous utilisez le FileLock de Java, est-il possible de laisser close () faire automatiquement un lock.release ()?

StackOverflow https://stackoverflow.com/questions/421833

  •  05-07-2019
  •  | 
  •  

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?

Était-ce utile?

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é.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top