Home / Programmazione / Java / File lock in Java
Mattepuffo

File lock in Java

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!!