package ilarkesto.io; import java.io.File; import java.io.FileNotFoundException; import java.io.IOException; import java.io.RandomAccessFile; import java.nio.channels.FileChannel; import java.nio.channels.FileLock; import java.nio.channels.OverlappingFileLockException; public class ExclusiveFileLock { private File file; private FileLock lock; public ExclusiveFileLock(File file) throws FileLockedException { this.file = file; file.getParentFile().mkdirs(); FileChannel channel; try { channel = new RandomAccessFile(file, "rw").getChannel(); } catch (FileNotFoundException ex) { throw new RuntimeException(ex); } try { lock = channel.tryLock(); } catch (OverlappingFileLockException ex) { lock = null; } catch (IOException ex) { throw new RuntimeException(ex); } if (lock == null) throw new FileLockedException(); } public void release() { try { lock.release(); } catch (IOException ex) { throw new RuntimeException(ex); } } public class FileLockedException extends Exception { private FileLockedException() { super("File already locked: " + file.getName()); } } }