Spec-Zone.ru › OpenJDK 27

Класс FileChannel

java.lang.Object
java.nio.channels.spi.AbstractInterruptibleChannel
java.nio.channels.FileChannel
Все реализованные интерфейсы:
Closeable, AutoCloseable, ByteChannel, Channel, GatheringByteChannel, InterruptibleChannel, ReadableByteChannel, ScatteringByteChannel, SeekableByteChannel, WritableByteChannel
public abstract class FileChannel extends AbstractInterruptibleChannel implements SeekableByteChannel, GatheringByteChannel, ScatteringByteChannel
Канал для чтения, записи, отображения и обработки файлов.

Файловый канал — это SeekableByteChannel, связанный с файлом. Он имеет текущую позицию в файле, которую можно как queried, так и modified. Сам файл содержит последовательность байтов переменной длины, которую можно читать и записывать, а её текущий size можно запросить. Размер файла увеличивается, когда байты записываются за пределами его текущего размера; размер файла уменьшается, когда он truncated. Файл также может иметь некоторые связанные с ним метаданные, такие как права доступа, тип содержимого и время последнего изменения; этот класс не определяет методы доступа к метаданным.

Помимо привычных операций чтения, записи и закрытия байтовых каналов, этот класс определяет следующие операции, специфичные для файлов:

  • Байты можно read или written в абсолютной позиции файла, не изменяя текущую позицию канала.

  • Область файла можно mapped непосредственно в память; для больших файлов это зачастую гораздо эффективнее, чем вызов обычных методов read или write.

  • Изменения, внесённые в файл, можно forced out на устройство хранения, что гарантирует сохранность данных в случае сбоя системы.

  • Байты можно передавать из файла to some other channel и vice versa таким образом, что многие операционные системы могут оптимизировать эту операцию, обеспечивая очень быструю передачу непосредственно в кэш файловой системы или из него.

  • Область файла можно locked, чтобы запретить доступ к ней другим программам.

Файловые каналы безопасно использовать из нескольких параллельных потоков. Метод close можно вызвать в любое время, как указано в интерфейсе Channel. В каждый момент времени может выполняться только одна операция, связанная с позицией канала или способная изменить размер файла; попытки начать вторую такую операцию, пока первая ещё выполняется, будут блокироваться до её завершения. Другие операции, в частности использующие явную позицию, могут выполняться параллельно; будет ли это происходить на самом деле, зависит от базовой реализации и поэтому не определено.

Представление файла, предоставляемое экземпляром этого класса, гарантированно согласовано с другими представлениями того же файла, предоставляемыми другими экземплярами в той же программе. Однако представление, предоставляемое экземпляром этого класса, может быть согласовано или не согласовано с представлениями, наблюдаемыми другими программами, выполняющимися одновременно, из-за кэширования базовой операционной системой и задержек, обусловленных протоколами сетевой файловой системы. Это верно независимо от языка, на котором написаны эти другие программы, и от того, выполняются ли они на той же машине или на другой. Точный характер любых таких несоответствий зависит от системы и поэтому не определён.

Файловый канал создаётся вызовом одного из методов open, определённых этим классом. Файловый канал также можно получить из существующего объекта FileInputStream, FileOutputStream или RandomAccessFile, вызвав метод getChannel этого объекта, который возвращает файловый канал, связанный с тем же базовым файлом. Если файловый канал получен из существующего потока или файла с произвольным доступом, состояние файлового канала тесно связано с состоянием объекта, чей метод getChannel вернул этот канал. Изменение позиции канала, явное или вызванное чтением либо записью байтов, изменит позицию файла исходного объекта, и наоборот. Изменение длины файла через файловый канал изменит длину, видимую через исходный объект, и наоборот. Запись байтов изменит содержимое файла, видимое исходным объектом, и наоборот. Закрытие канала приведёт к закрытию исходного объекта.

В разных местах этого класса указывается, что экземпляр должен быть «открыт для чтения», «открыт для записи» или «открыт для чтения и записи». Канал, полученный с помощью метода getChannel экземпляра FileInputStream, будет открыт для чтения. Канал, полученный с помощью метода getChannel экземпляра FileOutputStream, будет открыт для записи. Наконец, канал, полученный с помощью метода getChannel экземпляра RandomAccessFile, будет открыт для чтения, если экземпляр создан в режиме "r", и открыт для чтения и записи, если экземпляр создан в режиме "rw".

Файловый канал, открытый для записи, может находиться в режиме добавления; например, если он получен из выходного файлового потока, созданного вызовом конструктора FileOutputStream(File,boolean) с передачей true в качестве второго параметра. В этом режиме каждый вызов операции относительной записи сначала перемещает позицию в конец файла, а затем записывает запрошенные данные. Зависит от системы, выполняются ли перемещение позиции и запись данных одной атомарной операцией; поэтому это не определено. В этом режиме поведение метода для записи в заданную позицию также зависит от системы.

С версии:
1.4
См. также:
  • FileInputStream.getChannel()
  • FileOutputStream.getChannel()
  • RandomAccessFile.getChannel()

Краткое описание вложенных классов

Модификатор и тип Класс Описание
static class  FileChannel.MapMode
Режим отображения файла.

Краткое описание конструкторов

FileChannel()
Модификатор Конструктор Описание
protected
Инициализирует новый экземпляр этого класса.

Краткое описание методов

Модификатор и тип Метод Описание
abstract void force(boolean metaData)
Принудительно записывает все обновления файла этого канала на устройство хранения, на котором он находится.
final FileLock lock()
Получает эксклюзивную блокировку файла этого канала.
abstract FileLock lock(long position, long size, boolean shared)
Получает блокировку указанной области файла этого канала.
abstract MappedByteBuffer map(FileChannel.MapMode mode, long position, long size)
Отображает область файла этого канала непосредственно в память.
MemorySegment map(FileChannel.MapMode mode, long offset, long size, Arena arena)
Отображает область файла этого канала в новый сегмент отображённой памяти с заданными смещением, размером и ареной.
static FileChannel open(Path path, OpenOption... options)
Открывает или создаёт файл и возвращает файловый канал для доступа к нему.
static FileChannel open(Path path, Set<? extends OpenOption> options, FileAttribute<?>... attrs)
Открывает или создаёт файл и возвращает файловый канал для доступа к нему.
abstract long position()
Возвращает позицию файла для этого канала.
abstract FileChannel position(long newPosition)
Устанавливает позицию файла для этого канала.
abstract int read(ByteBuffer dst)
Считывает последовательность байтов из этого канала в заданный буфер.
final long read(ByteBuffer[] dsts)
Считывает последовательность байтов из этого канала в заданные буферы.
abstract long read(ByteBuffer[] dsts, int offset, int length)
Считывает последовательность байтов из этого канала в подпоследовательность заданных буферов.
abstract int read(ByteBuffer dst, long position)
Считывает последовательность байтов из этого канала в заданный буфер, начиная с указанной позиции файла.
abstract long size()
Возвращает текущий размер файла этого канала.
abstract long transferFrom(ReadableByteChannel src, long position, long count)
Передаёт байты из заданного канала для чтения байтов в файл этого канала.
abstract long transferTo(long position, long count, WritableByteChannel target)
Передаёт байты из файла этого канала в заданный канал для записи байтов.
abstract FileChannel truncate(long size)
Усекает файл этого канала до заданного размера.
final FileLock tryLock()
Пытается получить эксклюзивную блокировку файла этого канала.
abstract FileLock tryLock(long position, long size, boolean shared)
Пытается получить блокировку указанной области файла этого канала.
abstract int write(ByteBuffer src)
Записывает последовательность байтов из заданного буфера в этот канал.
final long write(ByteBuffer[] srcs)
Записывает последовательность байтов из заданных буферов в этот канал.
abstract long write(ByteBuffer[] srcs, int offset, int length)
Записывает последовательность байтов из подпоследовательности заданных буферов в этот канал.
abstract int write(ByteBuffer src, long position)
Записывает последовательность байтов из заданного буфера в этот канал, начиная с указанной позиции файла.

Методы, объявленные в классе AbstractInterruptibleChannel

begin, close, end, implCloseChannel, isOpen
Модификатор и тип Метод Описание
protected final void begin()
Отмечает начало операции ввода-вывода, которая может блокироваться неопределённо долго.
final void close()
Закрывает этот канал.
protected final void end(boolean completed)
Отмечает завершение операции ввода-вывода, которая может блокироваться неопределённо долго.
protected abstract void implCloseChannel()
Закрывает этот канал.
final boolean isOpen()
Сообщает, открыт ли этот канал.

Методы, объявленные в классе Object

clone, equals, finalize, getClass, hashCode, notify, notifyAll, toString, wait, wait, wait
Модификатор и тип Метод Описание
protected Object clone()
Создаёт и возвращает копию этого объекта.
boolean equals(Object obj)
Указывает, равен ли этот объект какому-либо другому объекту.
protected void finalize()
Устарело и будет удалено: этот элемент API подлежит удалению в будущей версии.
Финализация устарела и подлежит удалению в одном из будущих выпусков.
final Class<?> getClass()
Возвращает класс времени выполнения этого Object.
int hashCode()
Возвращает хеш-код этого объекта.
final void notify()
Пробуждает один поток, ожидающий на мониторе этого объекта.
final void notifyAll()
Пробуждает все потоки, ожидающие на мониторе этого объекта.
String toString()
Возвращает строковое представление объекта.
final void wait()
Переводит текущий поток в состояние ожидания до пробуждения, обычно в результате вызова notify или interrupt.
final void wait(long timeoutMillis)
Переводит текущий поток в состояние ожидания до пробуждения, обычно в результате вызова notify или interrupt, либо до истечения заданного промежутка времени.
final void wait(long timeoutMillis, int nanos)
Переводит текущий поток в состояние ожидания до пробуждения, обычно в результате вызова notify или interrupt, либо до истечения заданного промежутка времени.

Подробное описание конструкторов

FileChannel

protected FileChannel()
Инициализирует новый экземпляр этого класса.

Подробное описание методов

open

public static FileChannel open(Path path, Set<? extends OpenOption> options, FileAttribute<?>... attrs) throws IOException
Открывает или создает файл и возвращает файловый канал для доступа к нему.

Параметр options определяет способ открытия файла. Параметры READ и WRITE определяют, должен ли файл быть открыт для чтения и/или записи. Если массив не содержит ни один из этих параметров (или параметр APPEND), файл открывается для чтения. По умолчанию чтение или запись начинается с начала файла.

Помимо READ и WRITE, могут присутствовать следующие параметры:

дополнительные параметры
Параметр Описание
APPEND Если этот параметр присутствует, файл открывается для записи, и при каждом вызове метода канала write сначала выполняется переход в конец файла, а затем записываются запрошенные данные. Зависит от системы, выполняются ли переход и запись данных как одна атомарная операция, поэтому это не определено. Результат записи в указанную позицию при наличии этого параметра не определен. Этот параметр нельзя использовать вместе с параметрами READ или TRUNCATE_EXISTING.
TRUNCATE_EXISTING Если этот параметр присутствует, существующий файл усекается до размера 0 байт. Этот параметр игнорируется, если файл открыт только для чтения.
CREATE_NEW Если этот параметр присутствует, создается новый файл; операция завершается ошибкой, если файл уже существует. При создании файла проверка его существования и создание файла, если он не существует, выполняются атомарно относительно других операций файловой системы. Этот параметр игнорируется, если файл открыт только для чтения.
CREATE Если этот параметр присутствует, существующий файл открывается, если он существует; в противном случае создается новый файл. При создании файла проверка его существования и создание файла, если он не существует, выполняются атомарно относительно других операций файловой системы. Этот параметр игнорируется, если также присутствует параметр CREATE_NEW или файл открыт только для чтения.
DELETE_ON_CLOSE Если этот параметр присутствует, реализация прилагает все возможные усилия, чтобы удалить файл при его закрытии методом close. Если метод close не вызывается, все возможные усилия прилагаются для удаления файла при завершении работы виртуальной машины Java.
SPARSE При создании нового файла этот параметр служит подсказкой о том, что новый файл будет разреженным. Этот параметр игнорируется, если новый файл не создается.
SYNC Требует, чтобы каждое изменение содержимого или метаданных файла синхронно записывалось на базовое устройство хранения данных (см. целостность файлов при синхронизированном вводе-выводе).
DSYNC Требует, чтобы каждое изменение содержимого файла синхронно записывалось на базовое устройство хранения данных (см. целостность файлов при синхронизированном вводе-выводе).

Реализация также может поддерживать дополнительные параметры.

Параметр attrs — необязательный массив файловых file-attributes, которые следует атомарно задать при создании файла.

Новый канал создается вызовом метода newFileChannel у поставщика, создавшего Path.

Параметры:
path — путь к файлу, который нужно открыть или создать
options — параметры, определяющие способ открытия файла
attrs — необязательный список файловых атрибутов, которые следует атомарно задать при создании файла
Возвращает:
новый файловый канал
Исключения:
IllegalArgumentException — если набор содержит недопустимое сочетание параметров
UnsupportedOperationException — если path связан с поставщиком, не поддерживающим создание файловых каналов, указан неподдерживаемый параметр открытия или массив содержит атрибут, который нельзя атомарно задать при создании файла
FileAlreadyExistsException — если файл с таким именем уже существует, указан параметр CREATE_NEW и файл открывается для записи (необязательное конкретное исключение)
IOException — если возникает ошибка ввода-вывода
Начиная с версии:
1.7

open

public static FileChannel open(Path path, OpenOption... options) throws IOException
Открывает или создает файл и возвращает файловый канал для доступа к нему.

Вызов этого метода действует точно так же, как вызов

    fc.open(file, opts, new FileAttribute<?>[0]);
где opts — набор параметров, указанных в массиве options.
Параметры:
path — путь к файлу, который нужно открыть или создать
options — параметры, определяющие способ открытия файла
Возвращает:
новый файловый канал
Исключения:
IllegalArgumentException — если набор содержит недопустимое сочетание параметров
UnsupportedOperationException — если path связан с поставщиком, не поддерживающим создание файловых каналов, или указан неподдерживаемый параметр открытия
FileAlreadyExistsException — если файл с таким именем уже существует, указан параметр CREATE_NEW и файл открывается для записи (необязательное конкретное исключение)
IOException — если возникает ошибка ввода-вывода
Начиная с версии:
1.7

read

public abstract int read(ByteBuffer dst) throws IOException
Читает последовательность байтов из этого канала в указанный буфер.

Чтение байтов начинается с текущей позиции файла в этом канале, после чего позиция файла обновляется с учетом фактически прочитанного числа байтов. В остальном этот метод действует точно так, как указано в интерфейсе ReadableByteChannel.

Определено в:
read в интерфейсе ReadableByteChannel
Определено в:
read в интерфейсе SeekableByteChannel
Параметры:
dst — буфер, в который передаются байты
Возвращает:
число прочитанных байтов, возможно, ноль, или -1, если канал достиг конца потока
Исключения:
ClosedChannelException — если этот канал закрыт
AsynchronousCloseException — если другой поток закрывает этот канал во время выполнения операции чтения
ClosedByInterruptException — если другой поток прерывает текущий поток во время выполнения операции чтения, тем самым закрывая канал и устанавливая статус прерывания текущего потока
NonReadableChannelException — если этот канал не был открыт для чтения
IOException — если возникает другая ошибка ввода-вывода

read

public abstract long read(ByteBuffer[] dsts, int offset, int length) throws IOException
Читает последовательность байтов из этого канала в часть указанного массива буферов.

Чтение байтов начинается с текущей позиции файла в этом канале, после чего позиция файла обновляется с учетом фактически прочитанного числа байтов. В остальном этот метод действует точно так, как указано в интерфейсе ScatteringByteChannel.

Определено в:
read в интерфейсе ScatteringByteChannel
Параметры:
dsts — буферы, в которые передаются байты
offset — смещение в массиве буферов, указывающее на первый буфер, в который передаются байты; должно быть неотрицательным и не превышать dsts.length
length — максимальное число буферов для доступа; должно быть неотрицательным и не превышать dsts.length - offset
Возвращает:
число прочитанных байтов, возможно, ноль, или -1, если канал достиг конца потока
Исключения:
ClosedChannelException — если этот канал закрыт
AsynchronousCloseException — если другой поток закрывает этот канал во время выполнения операции чтения
ClosedByInterruptException — если другой поток прерывает текущий поток во время выполнения операции чтения, тем самым закрывая канал и устанавливая статус прерывания текущего потока
NonReadableChannelException — если этот канал не был открыт для чтения
IOException — если возникает другая ошибка ввода-вывода

read

public final long read(ByteBuffer[] dsts) throws IOException
Читает последовательность байтов из этого канала в указанные буферы.

Чтение байтов начинается с текущей позиции файла в этом канале, после чего позиция файла обновляется с учетом фактически прочитанного числа байтов. В остальном этот метод действует точно так, как указано в интерфейсе ScatteringByteChannel.

Определено в:
read в интерфейсе ScatteringByteChannel
Параметры:
dsts — буферы, в которые передаются байты
Возвращает:
число прочитанных байтов, возможно, ноль, или -1, если канал достиг конца потока
Исключения:
ClosedChannelException — если этот канал закрыт
AsynchronousCloseException — если другой поток закрывает этот канал во время выполнения операции чтения
ClosedByInterruptException — если другой поток прерывает текущий поток во время выполнения операции чтения, тем самым закрывая канал и устанавливая статус прерывания текущего потока
NonReadableChannelException — если этот канал не был открыт для чтения
IOException — если возникает другая ошибка ввода-вывода

write

public abstract int write(ByteBuffer src) throws IOException
Записывает последовательность байтов из указанного буфера в этот канал.

Запись байтов начинается с текущей позиции файла в этом канале, если канал не находится в режиме добавления; в этом случае сначала выполняется переход в конец файла. При необходимости размер файла увеличивается для размещения записываемых байтов, после чего позиция файла обновляется с учетом фактически записанного числа байтов. В остальном этот метод действует точно так, как указано в интерфейсе WritableByteChannel.

Определено в:
write в интерфейсе SeekableByteChannel
Определено в:
write в интерфейсе WritableByteChannel
Параметры:
src — буфер, из которого извлекаются байты
Возвращает:
число записанных байтов, возможно, ноль
Исключения:
ClosedChannelException — если этот канал закрыт
AsynchronousCloseException — если другой поток закрывает этот канал во время выполнения операции записи
ClosedByInterruptException — если другой поток прерывает текущий поток во время выполнения операции записи, тем самым закрывая канал и устанавливая статус прерывания текущего потока
NonWritableChannelException — если этот канал не был открыт для записи
IOException — если возникает другая ошибка ввода-вывода

write

public abstract long write(ByteBuffer[] srcs, int offset, int length) throws IOException
Записывает последовательность байтов из части указанного массива буферов в этот канал.

Запись байтов начинается с текущей позиции файла в этом канале, если канал не находится в режиме добавления; в этом случае сначала выполняется переход в конец файла. При необходимости размер файла увеличивается для размещения записываемых байтов, после чего позиция файла обновляется с учетом фактически записанного числа байтов. В остальном этот метод действует точно так, как указано в интерфейсе GatheringByteChannel.

Определено в:
write в интерфейсе GatheringByteChannel
Параметры:
srcs — буферы, из которых извлекаются байты
offset — смещение в массиве буферов, указывающее на первый буфер, из которого извлекаются байты; должно быть неотрицательным и не превышать srcs.length
length — максимальное число буферов для доступа; должно быть неотрицательным и не превышать srcs.length - offset
Возвращает:
число записанных байтов, возможно, ноль
Исключения:
ClosedChannelException — если этот канал закрыт
AsynchronousCloseException — если другой поток закрывает этот канал во время выполнения операции записи
ClosedByInterruptException — если другой поток прерывает текущий поток во время выполнения операции записи, тем самым закрывая канал и устанавливая статус прерывания текущего потока
NonWritableChannelException — если этот канал не был открыт для записи
IOException — если возникает другая ошибка ввода-вывода

write

public final long write(ByteBuffer[] srcs) throws IOException
Записывает последовательность байтов из указанных буферов в этот канал.

Запись байтов начинается с текущей позиции файла в этом канале, если канал не находится в режиме добавления; в этом случае сначала выполняется переход в конец файла. При необходимости размер файла увеличивается для размещения записываемых байтов, после чего позиция файла обновляется с учетом фактически записанного числа байтов. В остальном этот метод действует точно так, как указано в интерфейсе GatheringByteChannel.

Определено в:
write в интерфейсе GatheringByteChannel
Параметры:
srcs — буферы, из которых извлекаются байты
Возвращает:
число записанных байтов, возможно, ноль
Исключения:
ClosedChannelException — если этот канал закрыт
AsynchronousCloseException — если другой поток закрывает этот канал во время выполнения операции записи
ClosedByInterruptException — если другой поток прерывает текущий поток во время выполнения операции записи, тем самым закрывая канал и устанавливая статус прерывания текущего потока
NonWritableChannelException — если этот канал не был открыт для записи
IOException — если возникает другая ошибка ввода-вывода

position

public abstract long position() throws IOException
Возвращает позицию файла в этом канале.
Определено в:
position в интерфейсе SeekableByteChannel
Возвращает:
позицию файла в этом канале — неотрицательное целое число, обозначающее количество байтов от начала файла до текущей позиции
Исключения:
ClosedChannelException — если этот канал закрыт
IOException — если возникает другая ошибка ввода-вывода

position

public abstract FileChannel position(long newPosition) throws IOException
Устанавливает позицию файла в этом канале.

Допускается установить позицию, превышающую текущий размер файла, однако размер файла при этом не изменяется. Последующая попытка чтения байтов в такой позиции немедленно вернет признак конца файла. Последующая попытка записи байтов в такой позиции приведет к увеличению размера файла для размещения новых байтов; значения любых байтов между прежним концом файла и вновь записанными байтами не определены.

Определено в:
position в интерфейсе SeekableByteChannel
Параметры:
newPosition — новая позиция, неотрицательное целое число, обозначающее количество байтов от начала файла
Возвращает:
этот файловый канал
Исключения:
ClosedChannelException — если этот канал закрыт
IllegalArgumentException — если новая позиция отрицательна
IOException — если возникает другая ошибка ввода-вывода

size

public abstract long size() throws IOException
Возвращает текущий размер файла этого канала.
Определено в:
size в интерфейсе SeekableByteChannel
Возвращает:
текущий размер файла этого канала в байтах
Исключения:
ClosedChannelException — если этот канал закрыт
IOException — если возникает другая ошибка ввода-вывода

truncate

public abstract FileChannel truncate(long size) throws IOException
Усекает файл этого канала до указанного размера.

Если указанный размер меньше текущего размера файла, файл усекается, а все байты за новым концом файла отбрасываются. Если указанный размер больше или равен текущему размеру файла, файл не изменяется. В обоих случаях, если позиция файла в этом канале превышает указанный размер, она устанавливается равной этому размеру.

Определено в:
truncate в интерфейсе SeekableByteChannel
Параметры:
size — новый размер, неотрицательное число байтов
Возвращает:
этот файловый канал
Исключения:
NonWritableChannelException — если этот канал не был открыт для записи
ClosedChannelException — если этот канал закрыт
IllegalArgumentException — если новый размер отрицателен
IOException — если возникает другая ошибка ввода-вывода

force

public abstract void force(boolean metaData) throws IOException
Принудительно записывает все изменения файла этого канала на устройство хранения данных, на котором он находится.

Если файл этого канала расположен на локальном устройстве хранения данных, при возврате из этого метода гарантируется, что все изменения, внесенные в файл с момента создания этого канала или последнего вызова этого метода, будут записаны на это устройство. Это полезно для предотвращения потери критически важной информации в случае сбоя системы.

Если файл расположен не на локальном устройстве, такая гарантия не предоставляется.

Параметр metaData можно использовать, чтобы ограничить число операций ввода-вывода, которые должен выполнять этот метод. Передача false в качестве этого параметра означает, что в хранилище необходимо записать только изменения содержимого файла; передача true означает, что необходимо записать изменения как содержимого файла, так и его метаданных, что обычно требует как минимум одной дополнительной операции ввода-вывода. Зависит от базовой операционной системы, влияет ли этот параметр на результат, поэтому это не определено.

Вызов этого метода может привести к выполнению операции ввода-вывода, даже если канал был открыт только для чтения. Например, некоторые операционные системы хранят время последнего доступа как часть метаданных файла и обновляют его при каждом чтении файла. Зависит от системы, выполняется ли такое обновление, поэтому это не определено.

Этот метод гарантированно принудительно записывает только изменения, внесенные в файл этого канала с помощью методов, определенных в этом классе или в классах FileOutputStream и RandomAccessFile, если канал был получен с помощью метода getChannel. Изменения, внесенные путем изменения содержимого mapped byte buffer, полученного вызовом метода map, могут быть принудительно записаны, а могут и нет. Вызов метода force сопоставленного байтового буфера принудительно записывает изменения, внесенные в содержимое буфера.

Параметры:
metaData — если true, этот метод должен принудительно записать на устройство хранения данных изменения как содержимого файла, так и его метаданных; в противном случае достаточно принудительно записать только изменения содержимого
Исключения:
ClosedChannelException — если этот канал закрыт
IOException — если возникает другая ошибка ввода-вывода

transferTo

public abstract long transferTo(long position, long count, WritableByteChannel target) throws IOException
Передает байты из файла этого канала в указанный канал для записи байтов.

Предпринимается попытка прочитать до count байтов, начиная с указанной position в файле этого канала, и записать их в целевой канал. Этот метод может передать как все запрошенные байты, так и только часть; это зависит от особенностей и состояния каналов. Будет передано меньше запрошенного числа байтов, если файл этого канала содержит меньше count байтов, начиная с указанной position, или если целевой канал работает в неблокирующем режиме и в его выходном буфере свободно меньше count байтов.

Этот метод не изменяет позицию этого канала. Если указанная позиция больше или равна текущему размеру файла, байты не передаются. Если целевой канал имеет позицию, байты записываются начиная с нее, после чего позиция увеличивается на число записанных байтов.

Этот метод потенциально намного эффективнее простого цикла чтения из этого канала и записи в целевой канал. Многие операционные системы могут передавать байты непосредственно из кэша файловой системы в целевой канал, не копируя их фактически.

Параметры:
position — позиция в файле, с которой начинается передача; должна быть неотрицательной
count — максимальное число передаваемых байтов; должно быть неотрицательным
target — целевой канал
Возвращает:
фактически переданное число байтов, возможно, ноль
Исключения:
IllegalArgumentException — если не соблюдаются предварительные условия для параметров
NonReadableChannelException — если этот канал не был открыт для чтения
NonWritableChannelException — если целевой канал не был открыт для записи
ClosedChannelException — если этот или целевой канал закрыт
AsynchronousCloseException — если другой поток закрывает один из каналов во время передачи
ClosedByInterruptException — если другой поток прерывает текущий поток во время передачи, тем самым закрывая оба канала и устанавливая статус прерывания текущего потока
IOException — если возникает другая ошибка ввода-вывода

transferFrom

public abstract long transferFrom(ReadableByteChannel src, long position, long count) throws IOException
Передает байты из указанного канала для чтения байтов в файл этого канала.

Предпринимается попытка прочитать до count байтов из исходного канала и записать их в файл этого канала, начиная с указанной position. Этот метод может передать как все запрошенные байты, так и только часть; это зависит от особенностей и состояния каналов. Будет передано меньше запрошенного числа байтов, если в исходном канале осталось меньше count байтов или если исходный канал работает в неблокирующем режиме и в его входном буфере непосредственно доступно меньше count байтов. Если источник достиг конца потока, байты не передаются и возвращается ноль.

Этот метод не изменяет позицию этого канала. Если указанная позиция больше или равна текущему размеру файла, размер файла будет увеличен для размещения новых байтов; значения любых байтов между прежним концом файла и вновь записанными байтами не определены. Если исходный канал имеет позицию, чтение байтов начинается с этой позиции, после чего она увеличивается на число прочитанных байтов.

Этот метод потенциально намного эффективнее простого цикла чтения из исходного канала и записи в этот канал. Многие операционные системы могут передавать байты непосредственно из исходного канала в кэш файловой системы, не копируя их фактически.

Параметры:
src — исходный канал
position — позиция в файле, с которой начинается передача; должна быть неотрицательной
count — максимальное число передаваемых байтов; должно быть неотрицательным
Возвращает:
фактически переданное число байтов, возможно, ноль
Исключения:
IllegalArgumentException — если не соблюдаются предварительные условия для параметров
NonReadableChannelException — если исходный канал не был открыт для чтения
NonWritableChannelException — если этот канал не был открыт для записи
ClosedChannelException — если этот или исходный канал закрыт
AsynchronousCloseException — если другой поток закрывает один из каналов во время передачи
ClosedByInterruptException — если другой поток прерывает текущий поток во время передачи, тем самым закрывая оба канала и устанавливая статус прерывания текущего потока
IOException — если возникает другая ошибка ввода-вывода

read

public abstract int read(ByteBuffer dst, long position) throws IOException
Считывает последовательность байтов из этого канала в указанный буфер, начиная с заданной позиции в файле.

Этот метод работает так же, как метод read(ByteBuffer), за исключением того, что байты считываются начиная с заданной позиции в файле, а не с текущей позиции канала. Этот метод не изменяет позицию канала. Если заданная позиция больше текущего размера файла или равна ему, байты не считываются.

Параметры:
dst — буфер, в который будут переданы байты
position — позиция в файле, с которой начинается передача; должна быть неотрицательной
Возвращает:
Количество считанных байтов, возможно, ноль, или -1, если заданная позиция больше текущего размера файла или равна ему
Выбрасывает:
IllegalArgumentException — если позиция отрицательна или буфер доступен только для чтения
NonReadableChannelException — если этот канал не был открыт для чтения
ClosedChannelException — если этот канал закрыт
AsynchronousCloseException — если другой поток закрывает этот канал во время выполнения операции чтения
ClosedByInterruptException — если другой поток прерывает текущий поток во время выполнения операции чтения, тем самым закрывая канал и устанавливая статус прерывания текущего потока
IOException — если возникает другая ошибка ввода-вывода

write

public abstract int write(ByteBuffer src, long position) throws IOException
Записывает последовательность байтов из указанного буфера в этот канал, начиная с заданной позиции в файле.

Этот метод работает так же, как метод write(ByteBuffer), за исключением того, что байты записываются начиная с заданной позиции в файле, а не с текущей позиции канала. Этот метод не изменяет позицию канала. Если заданная позиция больше текущего размера файла или равна ему, размер файла будет увеличен для размещения новых байтов; значения байтов между прежним концом файла и вновь записанными байтами не определены.

Если файл открыт в режиме добавления, результат вызова этого метода не определен.

Параметры:
src — буфер, из которого будут переданы байты
position — позиция в файле, с которой начинается передача; должна быть неотрицательной
Возвращает:
Количество записанных байтов, возможно, ноль
Выбрасывает:
IllegalArgumentException — если позиция отрицательна
NonWritableChannelException — если этот канал не был открыт для записи
ClosedChannelException — если этот канал закрыт
AsynchronousCloseException — если другой поток закрывает этот канал во время выполнения операции записи
ClosedByInterruptException — если другой поток прерывает текущий поток во время выполнения операции записи, тем самым закрывая канал и устанавливая статус прерывания текущего потока
IOException — если возникает другая ошибка ввода-вывода

map

public abstract MappedByteBuffer map(FileChannel.MapMode mode, long position, long size) throws IOException
Отображает область файла этого канала непосредственно в память.

Параметр mode задает способ отображения области файла и может принимать один из следующих режимов:

  • Только для чтения: Любая попытка изменить результирующий буфер приведет к выбрасыванию исключения ReadOnlyBufferException. (MapMode.READ_ONLY)

  • Чтение и запись: Изменения, внесенные в результирующий буфер, со временем будут перенесены в файл; они могут быть видны другим программам, отобразившим тот же файл, а могут и не быть. (MapMode.READ_WRITE)

  • Приватный: Изменения, внесенные в результирующий буфер, не будут перенесены в файл и не будут видны другим программам, отобразившим тот же файл; вместо этого для измененных частей буфера будут созданы приватные копии. (MapMode.PRIVATE)

Реализация может поддерживать дополнительные режимы отображения.

Для отображения только для чтения этот канал должен быть открыт для чтения; для отображения с чтением и записью или приватного отображения канал должен быть открыт как для чтения, так и для записи.

Возвращаемый этим методом объект mapped byte buffer будет иметь нулевую позицию и предел и емкость, равные size; его метка будет не определена. Буфер и представленное им отображение будут оставаться действительными, пока сам буфер не будет собран сборщиком мусора.

После создания отображение не зависит от файлового канала, использованного для его создания. В частности, закрытие канала никак не влияет на действительность отображения.

Многие особенности файлов, отображенных в память, неизбежно зависят от базовой операционной системы и поэтому не определены. Поведение этого метода, если запрошенная область не полностью содержится в файле данного канала, не определено. Не определено, будут ли изменения содержимого или размера базового файла, внесенные этой или другой программой, перенесены в буфер. Не определена и скорость переноса изменений из буфера в файл.

Для большинства операционных систем отображение файла в память обходится дороже, чем чтение или запись нескольких десятков килобайт данных обычными методами read и write. С точки зрения производительности отображать в память обычно имеет смысл только относительно большие файлы.

Параметры:
mode — одна из констант READ_ONLY, READ_WRITE или PRIVATE, определенных в классе FileChannel.MapMode, в зависимости от того, следует ли отобразить файл только для чтения, для чтения и записи или приватно (копирование при записи), соответственно; также может быть указан режим отображения, зависящий от реализации
position — позиция в файле, с которой должна начинаться отображаемая область; должна быть неотрицательной
size — размер отображаемой области; должен быть неотрицательным и не превышать Integer.MAX_VALUE
Возвращает:
Отображенный байтовый буфер
Выбрасывает:
NonReadableChannelException — если mode имеет значение READ_ONLY или указан зависящий от реализации режим отображения, требующий доступа для чтения, но этот канал не был открыт для чтения
NonWritableChannelException — если mode имеет значение READ_WRITE, PRIVATE или указан зависящий от реализации режим отображения, требующий доступа для записи, но этот канал не был открыт одновременно для чтения и записи
IllegalArgumentException — если не выполнены предварительные условия для параметров
UnsupportedOperationException — если указан неподдерживаемый режим отображения
IOException — если возникает другая ошибка ввода-вывода
См. также:
  • FileChannel.MapMode
  • MappedByteBuffer

map

public MemorySegment map(FileChannel.MapMode mode, long offset, long size, Arena arena) throws IOException
Отображает область файла этого канала в новый сегмент отображенной памяти с указанными смещением, размером и ареной. Адрес возвращаемого сегмента памяти — это начальный адрес отображенной вне кучи области, на которой основан сегмент.

Срок жизни возвращаемого сегмента определяется предоставленной ареной. Например, если предоставленная арена допускает закрытие, возвращаемый сегмент будет отменен при закрытии этой арены.

Если указан режим отображения READ_ONLY, результирующий сегмент будет доступен только для чтения (см. MemorySegment.isReadOnly()).

Содержимое сегмента отображенной памяти может измениться в любой момент, например, если содержимое соответствующей области отображенного файла изменит эта или другая программа. Возникнут ли такие изменения и когда именно, зависит от операционной системы и поэтому не определено.

Весь сегмент отображенной памяти или его часть могут в любой момент стать недоступными, например, если отображенный файл-основа будет усечен. Попытка обратиться к недоступной области сегмента отображенной памяти не изменит содержимое сегмента и приведет к выбрасыванию исключения, вид которого не определен, либо во время обращения, либо позднее. Поэтому настоятельно рекомендуется принимать надлежащие меры предосторожности, чтобы эта или другая программа не изменяла отображенный файл, за исключением чтения или записи его содержимого.

Требования к реализации:
Реализация этого метода по умолчанию выбрасывает UnsupportedOperationException.
Примечание по реализации:
При получении отображенного сегмента из только что созданного файлового канала состояние инициализации содержимого блока отображенной памяти, связанного с возвращаемым сегментом, не определено и на него не следует полагаться.
Параметры:
mode — режим отображения файла; см. map(FileChannel.MapMode, long, long); режим отображения может влиять на поведение возвращаемого сегмента отображенной памяти (см. MemorySegment.force())
offset — смещение (в байтах) в файле, с которого должен начинаться отображаемый сегмент
size — размер (в байтах) отображенной памяти, на которой основан сегмент памяти
arena — арена сегмента
Возвращает:
Новый сегмент отображенной памяти
Выбрасывает:
IllegalArgumentException — если offset < 0, size < 0 или offset + size выходит за пределы диапазона long
IllegalStateException — если arena.isAlive() == false
WrongThreadException — если arena является ареной с ограниченной областью действия, а этот метод вызывается из потока T, отличного от потока-владельца арены с ограниченной областью действия
NonReadableChannelException — если mode имеет значение READ_ONLY или указан зависящий от реализации режим отображения, требующий доступа для чтения, но этот канал не был открыт для чтения
NonWritableChannelException — если mode имеет значение READ_WRITE, PRIVATE или указан зависящий от реализации режим отображения, требующий доступа для записи, но этот канал не был открыт одновременно для чтения и записи
IOException — если возникает другая ошибка ввода-вывода
UnsupportedOperationException — если указан неподдерживаемый режим отображения
С версии:
22

lock

public abstract FileLock lock(long position, long size, boolean shared) throws IOException
Получает блокировку указанной области файла этого канала.

Вызов этого метода блокирует выполнение до тех пор, пока область не удастся заблокировать, канал не будет закрыт или вызывающий поток не будет прерван — в зависимости от того, что произойдет первым.

Если во время вызова этого метода другой поток закрывает данный канал, будет выброшено исключение AsynchronousCloseException.

Если вызывающий поток прерывается во время ожидания блокировки, для него будет установлен статус прерывания и будет выброшено исключение FileLockInterruptionException. Если на момент вызова этого метода для вызывающего потока уже установлен статус прерывания, исключение будет выброшено немедленно; статус прерывания потока не изменится.

Область, заданная параметрами position и size, не обязана находиться внутри фактического базового файла или даже пересекаться с ним. Размер заблокированной области фиксирован; если изначально заблокированная область включает конец файла, а файл увеличивается за ее пределы, новая часть файла не будет охвачена блокировкой. Если ожидается, что размер файла будет увеличиваться, и требуется заблокировать весь файл, следует заблокировать область, начинающуюся с нуля и имеющую размер не меньше ожидаемого максимального размера файла. Метод lock() без аргументов просто блокирует область размером Long.MAX_VALUE. Если position неотрицателен, а size равен нулю, возвращается блокировка размером Long.MAX_VALUE - position.

Некоторые операционные системы не поддерживают совместные блокировки; в таком случае запрос совместной блокировки автоматически преобразуется в запрос исключительной блокировки. Узнать, является ли вновь полученная блокировка совместной или исключительной, можно, вызвав метод isShared полученного объекта блокировки.

Блокировки файлов удерживаются от имени всей виртуальной машины Java. Они не подходят для управления доступом к файлу нескольких потоков внутри одной виртуальной машины.

Параметры:
position — позиция, с которой должна начинаться заблокированная область; должна быть неотрицательной
size — размер заблокированной области; должен быть неотрицательным, а сумма position + size должна быть неотрицательной. Нулевое значение означает блокировку всех байтов от указанной начальной позиции до конца файла независимо от того, будет ли файл впоследствии расширен или усечен
shared — true для запроса совместной блокировки; в этом случае канал должен быть открыт для чтения (и, возможно, для записи); false для запроса исключительной блокировки; в этом случае канал должен быть открыт для записи (и, возможно, для чтения)
Возвращает:
Объект блокировки, представляющий вновь полученную блокировку
Выбрасывает:
IllegalArgumentException — если не выполнены предварительные условия для параметров
ClosedChannelException — если этот канал закрыт
AsynchronousCloseException — если другой поток закрывает этот канал, пока вызывающий поток заблокирован в этом методе
FileLockInterruptionException — если вызывающий поток прерывается, пока заблокирован в этом методе
OverlappingFileLockException — если блокировка, пересекающая запрошенную область, уже удерживается этой виртуальной машиной Java или если другой поток уже заблокирован в этом методе и пытается заблокировать пересекающуюся область
NonReadableChannelException — если shared имеет значение true, но канал не был открыт для чтения
NonWritableChannelException — если shared имеет значение false, но канал не был открыт для записи
IOException — если возникает другая ошибка ввода-вывода
См. также:
  • lock()
  • tryLock()
  • tryLock(long,long,boolean)

lock

public final FileLock lock() throws IOException
Получает исключительную блокировку файла этого канала.

Вызов этого метода в форме fc.lock() ведет себя точно так же, как вызов

    fc.lock(0L, Long.MAX_VALUE, false)
Возвращает:
Объект блокировки, представляющий вновь полученную блокировку
Выбрасывает:
ClosedChannelException — если этот канал закрыт
AsynchronousCloseException — если другой поток закрывает этот канал, пока вызывающий поток заблокирован в этом методе
FileLockInterruptionException — если вызывающий поток прерывается, пока заблокирован в этом методе
OverlappingFileLockException — если блокировка, пересекающая запрошенную область, уже удерживается этой виртуальной машиной Java или если другой поток уже заблокирован в этом методе и пытается заблокировать пересекающуюся область того же файла
NonWritableChannelException — если этот канал не был открыт для записи
IOException — если возникает другая ошибка ввода-вывода
См. также:
  • lock(long,long,boolean)
  • tryLock()
  • tryLock(long,long,boolean)

tryLock

public abstract FileLock tryLock(long position, long size, boolean shared) throws IOException
Пытается получить блокировку указанной области файла этого канала.

Этот метод не блокирует выполнение. Вызов всегда немедленно возвращает управление: либо блокировка запрошенной области получена, либо получить ее не удалось. Если получить блокировку не удалось из-за того, что другая программа удерживает пересекающуюся блокировку, метод возвращает null. Если получить блокировку не удалось по любой другой причине, выбрасывается соответствующее исключение.

Область, заданная параметрами position и size, не обязана находиться внутри фактического базового файла или даже пересекаться с ним. Размер заблокированной области фиксирован; если изначально заблокированная область включает конец файла, а файл увеличивается за ее пределы, новая часть файла не будет охвачена блокировкой. Если ожидается, что размер файла будет увеличиваться, и требуется заблокировать весь файл, следует заблокировать область, начинающуюся с нуля и имеющую размер не меньше ожидаемого максимального размера файла. Метод tryLock() без аргументов просто блокирует область размером Long.MAX_VALUE. Если position неотрицателен, а size равен нулю, возвращается блокировка размером Long.MAX_VALUE - position.

Некоторые операционные системы не поддерживают совместные блокировки; в таком случае запрос совместной блокировки автоматически преобразуется в запрос исключительной блокировки. Узнать, является ли вновь полученная блокировка совместной или исключительной, можно, вызвав метод isShared полученного объекта блокировки.

Блокировки файлов удерживаются от имени всей виртуальной машины Java. Они не подходят для управления доступом к файлу нескольких потоков внутри одной виртуальной машины.

Параметры:
position — позиция, с которой должна начинаться заблокированная область; должна быть неотрицательной
size — размер заблокированной области; должен быть неотрицательным, а сумма position + size должна быть неотрицательной. Нулевое значение означает блокировку всех байтов от указанной начальной позиции до конца файла независимо от того, будет ли файл впоследствии расширен или усечен
shared — true для запроса совместной блокировки, false для запроса исключительной блокировки
Возвращает:
Объект блокировки, представляющий вновь полученную блокировку, или null, если блокировку не удалось получить, поскольку другая программа удерживает пересекающуюся блокировку
Выбрасывает:
IllegalArgumentException — если не выполнены предварительные условия для параметров
ClosedChannelException — если этот канал закрыт
OverlappingFileLockException — если блокировка, пересекающая запрошенную область, уже удерживается этой виртуальной машиной Java или если другой поток уже заблокирован в этом методе и пытается заблокировать пересекающуюся область того же файла
NonReadableChannelException — если shared имеет значение true, но канал не был открыт для чтения
NonWritableChannelException — если shared имеет значение false, но канал не был открыт для записи
IOException — если возникает другая ошибка ввода-вывода
См. также:
  • lock()
  • lock(long,long,boolean)
  • tryLock()

tryLock

public final FileLock tryLock() throws IOException
Пытается получить исключительную блокировку файла этого канала.

Вызов этого метода в форме fc.tryLock() ведет себя точно так же, как вызов

    fc.tryLock(0L, Long.MAX_VALUE, false)
Возвращает:
Объект блокировки, представляющий вновь полученную блокировку, или null, если блокировку не удалось получить, поскольку другая программа удерживает пересекающуюся блокировку
Выбрасывает:
ClosedChannelException — если этот канал закрыт
OverlappingFileLockException — если блокировка, пересекающая запрошенную область, уже удерживается этой виртуальной машиной Java или если другой поток уже заблокирован в этом методе и пытается заблокировать пересекающуюся область
NonWritableChannelException — если этот канал не был открыт для записи
IOException — если возникает другая ошибка ввода-вывода
См. также:
  • lock()
  • lock(long,long,boolean)
  • tryLock(long,long,boolean)

Сообщить об ошибке или предложить улучшение
Дополнительные справочные материалы по API и документацию для разработчиков см. в разделе Документация Java SE, содержащем более подробные описания для разработчиков, концептуальные обзоры, определения терминов, обходные решения и примеры работающего кода. Другие версии.
Java является товарным знаком или зарегистрированным товарным знаком Oracle и/или ее аффилированных лиц в США и других странах.
Авторское право © 1993, 2026, Oracle и/или ее аффилированные лица, 500 Oracle Parkway, Redwood Shores, CA 94065 USA.
Все права защищены. Использование регулируется условиями лицензии и политикой распространения документации.

© 1993, 2025, 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.

Spec-Zone.ru

Настройки Оффлайн Что нового Помощь О нас
Spec-Zone .ru
спецификации, руководства, описания, API