File lock in Java
Lo scenario è questo: voglio evitare che venga avviato due volte lo stesso programma, e vorrei farlo senza usare l'ottima libreria JUnique.
Per farlo possiamo impostare un lock su un file e controllare su il lock è impostato o no.
Per questo useremo FileChannel e FileLock della libreria java.nio.
Mettiamo su la classe:
public class Locker {
private static FileChannel channel = null;
private static FileLock fileLock = null;
private static boolean isLocked = false;public static boolean lock(File file) throws FileNotFoundException, IOException {
if (!file.exists()) {
file.createNewFile();
channel = new RandomAccessFile(file, "rw").getChannel();
fileLock = channel.tryLock();
if (fileLock != null) {
isLocked = true;
}
}
return isLocked;
}public static void unlock(File file) throws IOException {
fileLock.release();
channel.close();
file.delete();
isLocked = false;
}public static boolean isLocked() {
return isLocked;
}
}
Il metodo lock, prima controlla se esiste il file che vogliamo bloccare, e in caso lo crea.
Poi tenta di "bloccarlo" con il metodo tryLock().
Il metodo unlock invece si preoccupa di rilasciare il lock e di cancellare il file (che è usato solo come file "temporaneo").
A questo punto nel main avremo una cosa del genere:
public static void main(String args[]) throws FileNotFoundException, IOException {
if (Locker.lock(new File("lock.clk"))) {
java.awt.EventQueue.invokeLater(new Runnable() {
@Override
public void run() {
new Main().setVisible(true);
}
});
} else {
JOptionPane.showMessageDialog(null, "Il file è bloccato da un altro processo");
}
}
In pratica non facciamo altro che richiamare il metodo lock visto prima e controllare se è impostat il lock o no.
Se non è impostato avviamo il programma, sennò mandiamo un bel messaggio.
Infine bisogna anche rilasciare il lock, e questo lo si può fare ad esempio in chiusura di programma (alla chiusura del JFrame potrebbe essere una soluzione).
Se non lo fate il file non verrà cancellato, e il programma risulterà sempre attivo anche se chiuso.
Ciao!!
java lock filechannel filelock file randomaccesfil
Commentami!