Как мы знаем, Java NIO поддерживает параллелизм и многопоточность, что позволяет ему работать с несколькими потоками, работающими с несколькими файлами одновременно. Но в некоторых случаях нам требуется, чтобы наш файл не получал общий доступ ни от одного потока и не был доступен.
Для такого требования NIO снова предоставляет API, известный как FileLock, который используется для обеспечения блокировки всего файла или его части, чтобы файл или его часть не были доступны для общего доступа.
чтобы обеспечить или применить такую блокировку, мы должны использовать FileChannel или AsynchronousFileChannel, который предоставляет для этой цели два метода lock () и tryLock (). Предоставляемая блокировка может быть двух типов:
-
Эксклюзивная блокировка — эксклюзивная блокировка не позволяет другим программам получать перекрывающуюся блокировку любого типа.
-
Общая блокировка . Общая блокировка не позволяет другим одновременно работающим программам получать перекрывающуюся эксклюзивную блокировку, но позволяет им получать перекрывающиеся общие блокировки.
Эксклюзивная блокировка — эксклюзивная блокировка не позволяет другим программам получать перекрывающуюся блокировку любого типа.
Общая блокировка . Общая блокировка не позволяет другим одновременно работающим программам получать перекрывающуюся эксклюзивную блокировку, но позволяет им получать перекрывающиеся общие блокировки.
Методы, используемые для получения блокировки над файлом —
-
lock () — этот метод FileChannel или AsynchronousFileChannel получает эксклюзивную блокировку для файла, связанного с данным каналом. Типом возврата этого метода является FileLock, который далее используется для мониторинга полученной блокировки.
-
lock (long position, long size, boolean shared) — этот метод снова является перегруженным методом блокировки и используется для блокировки определенной части файла.
-
tryLock () — этот метод возвращает FileLock или null, если блокировка не может быть получена, и он пытается получить явно исключительную блокировку для файла этого канала.
-
tryLock (long position, long size, boolean shared) — этот метод пытается получить блокировку в заданной области файла этого канала, которая может быть эксклюзивной или общего типа.
lock () — этот метод FileChannel или AsynchronousFileChannel получает эксклюзивную блокировку для файла, связанного с данным каналом. Типом возврата этого метода является FileLock, который далее используется для мониторинга полученной блокировки.
lock (long position, long size, boolean shared) — этот метод снова является перегруженным методом блокировки и используется для блокировки определенной части файла.
tryLock () — этот метод возвращает FileLock или null, если блокировка не может быть получена, и он пытается получить явно исключительную блокировку для файла этого канала.
tryLock (long position, long size, boolean shared) — этот метод пытается получить блокировку в заданной области файла этого канала, которая может быть эксклюзивной или общего типа.
Методы класса FileLock
-
acquBy () — этот метод возвращает канал, для которого была получена блокировка файла.
-
position () — этот метод возвращает позицию в файле первого байта заблокированной области. Блокированная область не должна содержаться внутри или даже перекрывать фактический базовый файл, поэтому значение, возвращаемое этим методом, может превышать текущий размер.
-
size () — этот метод возвращает размер заблокированной области в байтах. Блокированная область не должна содержаться внутри или даже перекрывать фактический базовый файл, поэтому значение, возвращаемое этим методом, может превышать текущий размер файла.
-
isShared () — Этот метод используется для определения того, является ли блокировка общей или нет.
-
overlaps (длинная позиция, длинный размер) — этот метод сообщает, перекрывает ли эта блокировка заданный диапазон блокировки.
-
isValid () — этот метод сообщает, действительна ли полученная блокировка. Объект блокировки остается действительным до тех пор, пока он не будет освобожден или соответствующий канал файла не будет закрыт, в зависимости от того, что произойдет раньше.
-
release () — Освобождает полученную блокировку. Если объект блокировки действителен, то вызов этого метода освобождает блокировку и делает объект недействительным. Если этот объект блокировки недействителен, то вызов этого метода не имеет никакого эффекта.
-
close () — этот метод вызывает метод release (). Он был добавлен в класс, чтобы его можно было использовать вместе с блочной конструкцией автоматического управления ресурсами.
acquBy () — этот метод возвращает канал, для которого была получена блокировка файла.
position () — этот метод возвращает позицию в файле первого байта заблокированной области. Блокированная область не должна содержаться внутри или даже перекрывать фактический базовый файл, поэтому значение, возвращаемое этим методом, может превышать текущий размер.
size () — этот метод возвращает размер заблокированной области в байтах. Блокированная область не должна содержаться внутри или даже перекрывать фактический базовый файл, поэтому значение, возвращаемое этим методом, может превышать текущий размер файла.
isShared () — Этот метод используется для определения того, является ли блокировка общей или нет.
overlaps (длинная позиция, длинный размер) — этот метод сообщает, перекрывает ли эта блокировка заданный диапазон блокировки.
isValid () — этот метод сообщает, действительна ли полученная блокировка. Объект блокировки остается действительным до тех пор, пока он не будет освобожден или соответствующий канал файла не будет закрыт, в зависимости от того, что произойдет раньше.
release () — Освобождает полученную блокировку. Если объект блокировки действителен, то вызов этого метода освобождает блокировку и делает объект недействительным. Если этот объект блокировки недействителен, то вызов этого метода не имеет никакого эффекта.
close () — этот метод вызывает метод release (). Он был добавлен в класс, чтобы его можно было использовать вместе с блочной конструкцией автоматического управления ресурсами.
Пример для демонстрации блокировки файла.
В следующем примере создайте блокировку для файла и запишите в него содержимое
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); } }