Java NIO - FileLock

Comme nous savons que Java NIO prend en charge la concurrence et le multi-threading, ce qui lui permet de gérer plusieurs threads fonctionnant sur plusieurs fichiers en même temps, mais dans certains cas, nous exigeons que notre fichier ne soit pas partagé par aucun thread et ne devienne non accessible.

Pour une telle exigence, NIO fournit à nouveau une API connue sous le nom de FileLock qui est utilisée pour fournir un verrou sur tout le fichier ou sur une partie de fichier, de sorte que le fichier ou sa partie ne soit pas partagé ou accessible.

afin de fournir ou d'appliquer un tel verrou, nous devons utiliser FileChannel ou AsynchronousFileChannel, qui fournit deux méthodes lock() et tryLock()à cet effet, la serrure fournie peut être de deux types -

  • Exclusive Lock - Un verrou exclusif empêche les autres programmes d'acquérir un verrou superposé de l'un ou l'autre type.

  • Shared Lock - Un verrou partagé empêche les autres programmes exécutés simultanément d'acquérir un verrou exclusif qui se chevauchent, mais leur permet d'acquérir des verrous partagés qui se chevauchent.

Méthodes utilisées pour obtenir le verrouillage du fichier -

  • lock() - Cette méthode de FileChannel ou AsynchronousFileChannel acquiert un verrou exclusif sur un fichier associé au canal donné. Le type de retour de cette méthode est FileLock qui est en outre utilisé pour surveiller le verrou obtenu.

  • lock(long position, long size, boolean shared) - Cette méthode est à nouveau la méthode surchargée de la méthode de verrouillage et est utilisée pour verrouiller une partie particulière d'un fichier.

  • tryLock() - Cette méthode renvoie un FileLock ou un null si le verrou n'a pas pu être acquis et qu'elle tente d'acquérir un verrou explicitement exclusif sur le fichier de ce canal.

  • tryLock(long position, long size, boolean shared) - Cette méthode tente d'acquérir un verrou sur la région donnée du fichier de ce canal qui peut être de type exclusif ou partagé.

Méthodes de la classe FileLock

  • acquiredBy() - Cette méthode renvoie le canal sur lequel le verrouillage de fichier a été acquis.

  • position() - Cette méthode renvoie la position dans le fichier du premier octet de la région verrouillée.Une région verrouillée n'a pas besoin d'être contenue dans, ni même de chevaucher, le fichier sous-jacent réel, de sorte que la valeur renvoyée par cette méthode peut dépasser la taille actuelle du fichier.

  • size() - Cette méthode renvoie la taille de la région verrouillée en octets. Une région verrouillée n'a pas besoin d'être contenue dans le fichier sous-jacent réel, ni même de chevaucher, de sorte que la valeur renvoyée par cette méthode peut dépasser la taille actuelle du fichier.

  • isShared() - Cette méthode est utilisée pour déterminer si le verrouillage est partagé ou non.

  • overlaps(long position,long size) - Cette méthode indique si ce verrou chevauche ou non la plage de verrouillage donnée.

  • isValid() - Cette méthode indique si le verrou obtenu est valide ou non. Un objet de verrouillage reste valide jusqu'à ce qu'il soit libéré ou que le canal de fichier associé soit fermé, selon la première éventualité.

  • release()- Libère le verrou obtenu.Si l'objet de verrouillage est valide, l'appel de cette méthode libère le verrou et rend l'objet invalide. Si cet objet de verrouillage n'est pas valide, l'appel de cette méthode n'a aucun effet.

  • close()- Cette méthode appelle la méthode release (). Il a été ajouté à la classe pour pouvoir être utilisé conjointement avec la construction de bloc de gestion automatique des ressources.

Exemple pour illustrer le verrouillage de fichier.

L'exemple suivant crée un verrou sur un fichier et y écrit du contenu

package com.java.nio;
import java.io.IOException;
import java.nio.ByteBuffer;
import java.nio.channels.FileChannel;
import java.nio.channels.FileLock;
import java.nio.file.Path;
import java.nio.file.Paths;
import java.nio.file.StandardOpenOption;
public class FileLockExample {
   public static void main(String[] args) throws IOException {
      String input = "Demo text to be written in locked mode.";  
      System.out.println("Input string to the test file is: " + input);  
      ByteBuffer buf = ByteBuffer.wrap(input.getBytes());  
      String fp = "D:file.txt";  
      Path pt = Paths.get(fp);  
      FileChannel channel = FileChannel.open(pt, StandardOpenOption.WRITE,StandardOpenOption.APPEND);  
      channel.position(channel.size() - 1); // position of a cursor at the end of file       
      FileLock lock = channel.lock();   
      System.out.println("The Lock is shared: " + lock.isShared());  
      channel.write(buf);  
      channel.close(); // Releases the Lock  
      System.out.println("Content Writing is complete. Therefore close the channel and release the lock.");  
      PrintFileCreated.print(fp);  
   }  
}
package com.java.nio;
import java.io.BufferedReader;
import java.io.FileReader;
import java.io.IOException;
public class PrintFileCreated {
   public static void print(String path) throws IOException {  
      FileReader filereader = new FileReader(path);  
      BufferedReader bufferedreader = new BufferedReader(filereader);  
      String tr = bufferedreader.readLine();    
      System.out.println("The Content of testout.txt file is: ");  
      while (tr != null) {      
         System.out.println("    " + tr);  
         tr = bufferedreader.readLine();  
      }  
   filereader.close();  
   bufferedreader.close();  
   }  
}

Production

Input string to the test file is: Demo text to be written in locked mode.
The Lock is shared: false
Content Writing is complete. Therefore close the channel and release the lock.
The Content of testout.txt file is: 
To be or not to be?Demo text to be written in locked mode.