Класс 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
- См. также:
Краткое описание вложенных классов
| Модификатор и тип | Класс | Описание |
|---|---|---|
static class |
FileChannel.MapMode |
Режим отображения файла. |
Краткое описание конструкторов
| Модификатор | Конструктор | Описание |
|---|---|---|
protected |
Инициализирует новый экземпляр этого класса. |
Краткое описание методов
| Модификатор и тип | Метод | Описание |
|---|---|---|
abstract void |
force |
Принудительно записывает все обновления файла этого канала на устройство хранения, на котором он находится. |
final FileLock |
lock() |
Получает эксклюзивную блокировку файла этого канала. |
abstract FileLock |
lock |
Получает блокировку указанной области файла этого канала. |
abstract MappedByteBuffer |
map |
Отображает область файла этого канала непосредственно в память. |
MemorySegment |
map |
Отображает область файла этого канала в новый сегмент отображённой памяти с заданными смещением, размером и ареной. |
static FileChannel |
open |
Открывает или создаёт файл и возвращает файловый канал для доступа к нему. |
static FileChannel |
open |
Открывает или создаёт файл и возвращает файловый канал для доступа к нему. |
abstract long |
position() |
Возвращает позицию файла для этого канала. |
abstract FileChannel |
position |
Устанавливает позицию файла для этого канала. |
abstract int |
read |
Считывает последовательность байтов из этого канала в заданный буфер. |
final long |
read |
Считывает последовательность байтов из этого канала в заданные буферы. |
abstract long |
read |
Считывает последовательность байтов из этого канала в подпоследовательность заданных буферов. |
abstract int |
read |
Считывает последовательность байтов из этого канала в заданный буфер, начиная с указанной позиции файла. |
abstract long |
size() |
Возвращает текущий размер файла этого канала. |
abstract long |
transferFrom |
Передаёт байты из заданного канала для чтения байтов в файл этого канала. |
abstract long |
transferTo |
Передаёт байты из файла этого канала в заданный канал для записи байтов. |
abstract FileChannel |
truncate |
Усекает файл этого канала до заданного размера. |
final FileLock |
tryLock() |
Пытается получить эксклюзивную блокировку файла этого канала. |
abstract FileLock |
tryLock |
Пытается получить блокировку указанной области файла этого канала. |
abstract int |
write |
Записывает последовательность байтов из заданного буфера в этот канал. |
final long |
write |
Записывает последовательность байтов из заданных буферов в этот канал. |
abstract long |
write |
Записывает последовательность байтов из подпоследовательности заданных буферов в этот канал. |
abstract int |
write |
Записывает последовательность байтов из заданного буфера в этот канал, начиная с указанной позиции файла. |
Методы, объявленные в классе AbstractInterruptibleChannel
begin, close, end, implCloseChannel, isOpen | Модификатор и тип | Метод | Описание |
|---|---|---|
protected final void |
begin() |
Отмечает начало операции ввода-вывода, которая может блокироваться неопределённо долго. |
final void |
close() |
Закрывает этот канал. |
protected final void |
end |
Отмечает завершение операции ввода-вывода, которая может блокироваться неопределённо долго. |
protected abstract void |
implCloseChannel() |
Закрывает этот канал. |
final boolean |
isOpen() |
Сообщает, открыт ли этот канал. |
Методы, объявленные в классе Object
clone, equals, finalize, getClass, hashCode, notify, notifyAll, toString, wait, wait, wait | Модификатор и тип | Метод | Описание |
|---|---|---|
protected Object |
clone() |
Создаёт и возвращает копию этого объекта. |
boolean |
equals |
Указывает, равен ли этот объект какому-либо другому объекту. |
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 |
Переводит текущий поток в состояние ожидания до пробуждения, обычно в результате вызова notify или interrupt, либо до истечения заданного промежутка времени. |
final void |
wait |
Переводит текущий поток в состояние ожидания до пробуждения, обычно в результате вызова 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— если возникает другая ошибка ввода-вывода - См. также:
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
public final FileLock lock() throws IOException
Вызов этого метода в форме fc.lock() ведет себя точно так же, как вызов
fc.lock(0L, Long.MAX_VALUE, false)
- Возвращает:
- Объект блокировки, представляющий вновь полученную блокировку
- Выбрасывает:
-
ClosedChannelException— если этот канал закрыт -
AsynchronousCloseException— если другой поток закрывает этот канал, пока вызывающий поток заблокирован в этом методе -
FileLockInterruptionException— если вызывающий поток прерывается, пока заблокирован в этом методе -
OverlappingFileLockException— если блокировка, пересекающая запрошенную область, уже удерживается этой виртуальной машиной Java или если другой поток уже заблокирован в этом методе и пытается заблокировать пересекающуюся область того же файла -
NonWritableChannelException— если этот канал не был открыт для записи -
IOException— если возникает другая ошибка ввода-вывода - См. также:
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— если возникает другая ошибка ввода-вывода - См. также:
tryLock
public final FileLock tryLock() throws IOException
Вызов этого метода в форме fc.tryLock() ведет себя точно так же, как вызов
fc.tryLock(0L, Long.MAX_VALUE, false)
- Возвращает:
- Объект блокировки, представляющий вновь полученную блокировку, или
null, если блокировку не удалось получить, поскольку другая программа удерживает пересекающуюся блокировку - Выбрасывает:
-
ClosedChannelException— если этот канал закрыт -
OverlappingFileLockException— если блокировка, пересекающая запрошенную область, уже удерживается этой виртуальной машиной Java или если другой поток уже заблокирован в этом методе и пытается заблокировать пересекающуюся область -
NonWritableChannelException— если этот канал не был открыт для записи -
IOException— если возникает другая ошибка ввода-вывода - См. также:
© 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.