Класс FileLock
- java.lang.Object
-
- java.nio.channels.FileLock
- Все реализуемые интерфейсы:
AutoCloseable
public abstract class FileLock extends Object implements AutoCloseable
Токен, представляющий блокировку региона файла.
Объект блокировки файла создается каждый раз, когда блокировка приобретается на файле с помощью одного из методов lock или tryLock класса FileChannel, или методов lock или tryLock класса AsynchronousFileChannel.
Объект блокировки файла изначально действителен. Он остается действительным до тех пор, пока блокировка не будет освобождена вызовом метода release, путем закрытия канала, используемого для ее получения, или по завершении работы виртуальной машины Java, в зависимости от того, что наступит раньше. Действительность блокировки может быть проверена путем вызова метода isValid.
Блокировка файла может быть исключительной или совместной. Блокировка по совместному доступу предотвращает другие выполняющиеся одновременно программы от получения перекрывающейся исключительной блокировки, но позволяет им получать перекрывающиеся совместные блокировки. Исключительная блокировка предотвращает другие программы от получения перекрывающейся блокировки любого типа. После ее освобождения блокировка больше не оказывает никакого влияния на блокировки, которые могут быть получены другими программами.
Является ли блокировка исключительной или совместной, можно определить, вызвав метод isShared. Некоторые платформы не поддерживают совместные блокировки, в этом случае запрос на совместную блокировку автоматически преобразуется в запрос на исключительную блокировку.
Блокировки, удерживаемые на одном файле одной виртуальной машиной Java, не перекрываются. Метод overlaps можно использовать для проверки того, перекрывается ли диапазон кандидатской блокировки существующей блокировкой.
Объект блокировки файла записывает канал файла, на котором удерживается блокировка, тип и действительность блокировки, а также позицию и размер заблокированного региона. Только действительность блокировки может меняться со временем; все другие аспекты состояния блокировки неизменны.
Файловые блокировки удерживаются от имени всей виртуальной машины Java. Они не подходят для управления доступом к файлу несколькими потоками в одной виртуальной машине.
Объекты блокировок файлов безопасны для использования несколькими параллельными потоками.
Зависимости от платформы
Этот API блокировки файлов предназначен для прямого отображения на средства блокировки нативного операционной системы. Таким образом, блокировки, удерживаемые на файле, должны быть видны всем программам, имеющим доступ к файлу, независимо от языка, на котором эти программы написаны.
Действительно ли блокировка предотвращает другую программу от доступа к содержимому заблокированного региона, зависит от системы и поэтому не определено. Средства нативной блокировки файлов некоторых систем являются только рекомендательными, что означает, что программы должны сотрудничать, соблюдая известный протокол блокировки, чтобы гарантировать целостность данных. В других системах нативные файловые блокировки являются обязательными, что означает, что если одна программа блокирует область файла, то другие программы фактически не смогут получить доступ к этой области таким образом, который нарушил бы блокировку. В других системах, является ли нативная блокировка файлов рекомендательной или обязательной, настраивается для каждого файла. Чтобы обеспечить согласованное и правильное поведение на всех платформах, настоятельно рекомендуется использовать блокировки, предоставляемые этим API, как если бы они были рекомендательными блокировками.
В некоторых системах получение обязательной блокировки области файла препятствует отображению этой области с помощью mapped into memory, и наоборот. Программы, которые сочетают блокировки и отображение, должны быть готовы к тому, что такое сочетание может завершиться неудачей.
В некоторых системах закрытие канала освобождает все блокировки, удерживаемые виртуальной машиной Java на файле, независимо от того, были ли блокировки получены через этот канал или через другой канал, открытый в том же файле. Настоятельно рекомендуется использовать в программе отдельный канал для получения всех блокировок любого заданного файла.
Некоторые сетевые файловые системы позволяют использовать блокировку файлов с файлами, отображенными в памяти, только когда заблокированные области выровнены по страницам и представляют собой целое кратное размера страницы базового оборудования. Некоторые сетевые файловые системы не реализуют блокировки файлов в областях, которые выходят за определенную позицию, часто 230 или 231. В общем случае следует проявлять особую осторожность при блокировании файлов, находящихся в сетевых файловых системах.
- С момента:
- 1.4
Конструкторы
| Модификатор | Конструктор | Описание |
|---|---|---|
protected | FileLock(AsynchronousFileChannel channel,
long position,
long size,
boolean shared) | Инициализирует новый экземпляр этого класса. |
protected | FileLock(FileChannel channel,
long position,
long size,
boolean shared) | Инициализирует новый экземпляр этого класса. |
Методы
| Модификатор и тип | Метод | Описание |
|---|---|---|
Channel | acquiredBy() | Возвращает канал, на файл которого была получена эта блокировка. |
FileChannel | channel() | Возвращает канал файла, на файл которого была получена эта блокировка. |
void | close() | Этот метод вызывает метод |
boolean | isShared() | Указывает, является ли эта блокировка совместной. |
abstract boolean | isValid() | Указывает, действительна ли эта блокировка. |
boolean | overlaps(long position,
long size) | Указывает, перекрывает ли эта блокировка заданный диапазон блокировки. |
long | position() | Возвращает позицию в файле первого байта заблокированного региона. |
abstract void | release() | Освобождает эту блокировку. |
long | size() | Возвращает размер заблокированного региона в байтах. |
String | toString() | Возвращает строку, описывающую диапазон, тип и действительность этой блокировки. |
Методы, объявленные в классе java.lang.Object
clone, equals, finalize, getClass, hashCode, notify, notifyAll, wait, wait, wait Конструкторы
FileLock
protected FileLock(FileChannel channel,
long position,
long size,
boolean shared) Инициализирует новый экземпляр этого класса.
- Параметры:
-
channel- Канал файла, на котором удерживается этот замок -
position- Позиция в файле, с которой начинается заблокированная область; должна быть неотрицательной -
size- Размер заблокированной области; должен быть неотрицательным, и суммаposition+sizeдолжна быть неотрицательной -
shared-trueесли этот замок является общим,falseесли он является исключительным - Исключения:
-
IllegalArgumentException- Если условия на параметрах не выполняются
FileLock
protected FileLock(AsynchronousFileChannel channel,
long position,
long size,
boolean shared) Инициализирует новый экземпляр этого класса.
- Параметры:
-
channel- Канал, на файле которого удерживается этот замок -
position- Позиция в файле, с которой начинается заблокированная область; должна быть неотрицательной -
size- Размер заблокированной области; должен быть неотрицательным, и суммаposition+sizeдолжна быть неотрицательной -
shared-trueесли этот замок является общим,falseесли он является исключительным - Исключения:
-
IllegalArgumentException- Если условия на параметрах не выполняются - С момента:
- 1.7
Методы
channel
public final FileChannel channel()
Возвращает канал файла, на файле которого был получен этот замок.
Этот метод устарел, его заменил метод acquiredBy.
- Возвращает:
- Канал файла или
nullесли замок файла не был получен каналом файла.
acquiredBy
public Channel acquiredBy()
Возвращает канал, на файле которого был получен этот замок.
- Возвращает:
- Канал, на файле которого был получен этот замок.
- С момента:
- 1.7
position
public final long position()
Возвращает позицию в файле первого байта заблокированной области.
Заблокированная область не обязательно должна содержаться в или даже перекрываться фактическим базовым файлом, поэтому значение, возвращаемое этим методом, может превышать текущий размер файла.
- Возвращает:
- Позицию
size
public final long size()
Возвращает размер заблокированной области в байтах.
Заблокированная область не обязательно должна содержаться в или даже перекрываться фактическим базовым файлом, поэтому значение, возвращаемое этим методом, может превышать текущий размер файла.
- Возвращает:
- Размер заблокированной области
isShared
public final boolean isShared()
Определяет, является ли этот замок общим.
- Возвращает:
-
trueесли замок общий,falseесли он исключительный
overlaps
public final boolean overlaps(long position,
long size) Определяет, перекрывает ли этот замок заданный диапазон замка.
- Параметры:
-
position- Начальная позиция диапазона замка -
size- Размер диапазона замка - Возвращает:
-
trueесли и только если этот замок и заданный диапазон замка перекрываются как минимум одним байтом
isValid
public abstract boolean isValid()
Определяет, является ли этот замок валидным.
Объект замка остается валидным до тех пор, пока он не будет освобожден или связанный канал файла не будет закрыт, что произойдет раньше.
- Возвращает:
-
trueесли и только если этот замок валидный
release
public abstract void release()
throws IOException Освобождает этот замок.
Если этот объект замка валидный, вызов этого метода освобождает замок и делает объект невалидным. Если этот объект замка невалидный, вызов этого метода не имеет эффекта.
- Исключения:
-
ClosedChannelException- Если канал, который использовался для получения этого замка, больше не открыт -
IOException- Если происходит ошибка ввода-вывода
close
public final void close()
throws IOException Этот метод вызывает метод release(). Он был добавлен в класс, чтобы он мог быть использован в сочетании с блоком автоматического управления ресурсами.
- Определено в:
-
closeв интерфейсеAutoCloseable - Исключения:
IOException- С момента:
- 1.7
toString
public final String toString()
Возвращает строку, описывающую диапазон, тип и валидность этого замка.
© 1993, 2020, Oracle and/or its affiliates. All rights reserved.
Documentation extracted from Debian's OpenJDK Development Kit package.
Licensed under the GNU General Public License, version 2, with the Classpath Exception.
Various third party code in OpenJDK is licensed under different licenses (see Debian package).
Java and OpenJDK are trademarks or registered trademarks of Oracle and/or its affiliates.
https://docs.oracle.com/en/java/javase/11/docs/api/java.base/java/nio/channels/FileLock.html