Класс 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 Безопасное перечисление режимов отображения файла. |
Краткое описание конструкторов
| Модификатор | Конструктор и описание |
|---|---|
protected |
FileChannel() Инициализирует новый экземпляр этого класса. |
Краткое описание методов
| Модификатор и тип | Метод и описание |
|---|---|
abstract void |
force(boolean metaData) Принудительно записывает все обновления файла этого канала на устройство хранения, которое его содержит. |
FileLock |
lock() Получает эксклюзивную блокировку файла этого канала. |
abstract FileLock |
lock(long position,
long size,
boolean shared) Получает блокировку заданного региона файла этого канала. |
abstract MappedByteBuffer |
map(FileChannel.MapMode mode,
long position,
long size) Отображает регион файла этого канала напрямую в память. |
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) Считывает последовательность байтов из этого канала в заданный буфер. |
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) Усекает файл этого канала до заданного размера. |
FileLock |
tryLock() Попытка получить эксклюзивную блокировку файла этого канала. |
abstract FileLock |
tryLock(long position,
long size,
boolean shared) Попытка получить блокировку заданного региона файла этого канала. |
abstract int |
write(ByteBuffer src) Записывает последовательность байтов в этот канал из заданного буфера. |
long |
write(ByteBuffer[] srcs) Записывает последовательность байтов в этот канал из заданных буферов. |
abstract long |
write(ByteBuffer[] srcs,
int offset,
int length) Записывает последовательность байтов в этот канал из подпоследовательности заданных буферов. |
abstract int |
write(ByteBuffer src,
long position) Записывает последовательность байтов в этот канал из заданного буфера, начиная с заданной позиции файла. |
Методы, унаследованные от класса java.nio.channels.spi.AbstractInterruptibleChannel
begin, close, end, implCloseChannel, isOpen Методы, унаследованные от класса java.lang.Object
clone, equals, finalize, getClass, hashCode, notify, notifyAll, toString, wait, wait, wait Методы, унаследованные от интерфейса java.nio.channels.Channel
close, isOpen Конструкторы
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ассоциирован с поставщиком, который не поддерживает создание каналов файлов, или указан неподдерживаемый параметр открытия, или массив содержит атрибут, который не может быть атомарно установлен при создании файла -
IOException- Если произошла ошибка ввода-вывода -
SecurityException- Если установлен менеджер безопасности и он отклоняет не указанное разрешение, необходимое реализации. В случае с поставщиком по умолчанию, вызывается методSecurityManager.checkRead(String)для проверки доступа на чтение, если файл открывается для чтения. Вызывается методSecurityManager.checkWrite(String)для проверки доступа на запись, если файл открывается для записи - С:
- 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ассоциирован с поставщиком, который не поддерживает создание каналов файлов, или указан неподдерживаемый параметр открытия -
IOException- Если произошла ошибка ввода-вывода -
SecurityException- Если установлен менеджер безопасности и он отклоняет не указанное разрешение, необходимое реализации. В случае с поставщиком по умолчанию, вызывается методSecurityManager.checkRead(String)для проверки доступа на чтение, если файл открывается для чтения. Вызывается методSecurityManager.checkWrite(String)для проверки доступа на запись, если файл открывается для записи - С:
- 1.7
read
public abstract int read(ByteBuffer dst)
throws IOException Читает последовательность байтов из этого канала в заданный буфер.
Байты читаются, начиная с текущей позиции файла этого канала, а затем позиция файла обновляется числом прочитанных байтов. В противном случае этот метод ведёт себя точно так, как указано в интерфейсе ReadableByteChannel.
- Определено:
-
readв интерфейсеReadableByteChannel - Определено:
-
readв интерфейсеSeekableByteChannel - Параметры:
-
dst- Буфер, в который должны быть переданы байты - Возвращает:
- Количество прочитанных байтов, возможно ноль, или
-1если канал достиг конца потока - Исключения:
-
ClosedChannelException- Если этот канал закрыт -
AsynchronousCloseException- Если другой поток закрывает этот канал во время операции чтения -
ClosedByInterruptException- Если другой поток прерывает текущий поток во время операции чтения, тем самым закрывая канал и устанавливая статус прерывания текущего потока -
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- Если другой поток прерывает текущий поток во время операции чтения, тем самым закрывая канал и устанавливая статус прерывания текущего потока -
IOException- Если произошла другая ошибка ввода-вывода
read
public final long read(ByteBuffer[] dsts)
throws IOException Читает последовательность байтов из этого канала в заданные буферы.
Байты читаются, начиная с текущей позиции файла этого канала, а затем позиция файла обновляется числом прочитанных байтов. В противном случае этот метод ведёт себя точно так, как указано в интерфейсе ScatteringByteChannel.
- Указано в:
-
readв интерфейсеScatteringByteChannel - Параметры:
-
dsts- Буферы, в которые будут переданы байты - Возвращает:
- Количество считанных байтов, возможно ноль, или
-1если канал достиг конца потока - Исключение:
-
ClosedChannelException- Если этот канал закрыт -
AsynchronousCloseException- Если другой поток закрывает этот канал во время операции чтения -
ClosedByInterruptException- Если другой поток прерывает текущий поток во время операции чтения, тем самым закрывая канал и устанавливая статус прерывания текущего потока -
IOException- Если произошла другая ошибка ввода-вывода
write
public abstract int write(ByteBuffer src)
throws IOException Записывает последовательность байтов в этот канал из заданного буфера.
Байты записываются, начиная с текущей позиции файла этого канала, если канал не в режиме добавления, в противном случае позиция сначала перемещается в конец файла. Файл увеличивается при необходимости, чтобы вместить записанные байты, а затем позиция файла обновляется количеством фактически записанных байтов. В противном случае этот метод ведет себя точно так, как указано в интерфейсе WritableByteChannel.
- Указано в:
-
writeв интерфейсеSeekableByteChannel - Указано в:
-
writeв интерфейсеWritableByteChannel - Параметры:
-
src- Буфер, из которого необходимо извлечь байты - Возвращает:
- Количество записанных байтов, возможно ноль
- Исключение:
-
ClosedChannelException- Если этот канал закрыт -
AsynchronousCloseException- Если другой поток закрывает этот канал во время операции записи -
ClosedByInterruptException- Если другой поток прерывает текущий поток во время операции записи, тем самым закрывая канал и устанавливая статус прерывания текущего потока -
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- Если другой поток прерывает текущий поток во время операции записи, тем самым закрывая канал и устанавливая статус прерывания текущего потока -
IOException- Если произошла другая ошибка ввода-вывода
write
public final long write(ByteBuffer[] srcs)
throws IOException Записывает последовательность байтов в этот канал из заданных буферов.
Байты записываются, начиная с текущей позиции файла этого канала, если канал не в режиме добавления, в противном случае позиция сначала перемещается в конец файла. Файл увеличивается при необходимости, чтобы вместить записанные байты, а затем позиция файла обновляется количеством фактически записанных байтов. В противном случае этот метод ведет себя точно так, как указано в интерфейсе GatheringByteChannel.
- Указано в:
-
writeв интерфейсеGatheringByteChannel - Параметры:
-
srcs- Буферы, из которых необходимо извлечь байты - Возвращает:
- Количество записанных байтов, возможно ноль
- Исключение:
-
ClosedChannelException- Если этот канал закрыт -
AsynchronousCloseException- Если другой поток закрывает этот канал во время операции записи -
ClosedByInterruptException- Если другой поток прерывает текущий поток во время операции записи, тем самым закрывая канал и устанавливая статус прерывания текущего потока -
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 означает, что необходимо записать обновления как содержимого файла, так и метаданных, что обычно требует как минимум одной дополнительной операции ввода-вывода. Действительно ли этот параметр имеет какой-либо эффект, зависит от используемой операционной системы и поэтому не определён.
Вызов этого метода может привести к выполнению операции ввода-вывода, даже если канал был открыт только для чтения. Например, некоторые операционные системы хранят время последнего доступа в качестве части метаданных файла, и это время обновляется при каждом чтении файла. Происходит ли это на самом деле, зависит от системы, и поэтому не определено.
Этот метод гарантирует только принудительное выполнение изменений, которые были внесены в файл этого канала через методы, определённые в этом классе. Он может или не может принудительно выполнить изменения, внесённые путём изменения содержимого 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 Картирует область файла этого канала напрямую в память.
Область файла может быть отображена в память в одном из трех режимов:
Только чтение: любая попытка изменить полученный буфер приведет к возбуждению
ReadOnlyBufferException. (MapMode.READ_ONLY)Чтение/запись: изменения, внесенные в результирующий буфер, в конечном итоге будут перенесены в файл; они могут или не могут быть видны другим программам, которые отобразили тот же файл. (
MapMode.READ_WRITE)Приватный: изменения, внесенные в результирующий буфер, не будут перенесены в файл и не будут видны другим программам, которые отобразили тот же файл; вместо этого они приведут к созданию приватных копий измененных частей буфера. (
MapMode.PRIVATE)
Для отображения только для чтения этот канал должен был быть открыт для чтения; для отображения для чтения/записи или приватного отображения этот канал должен быть открыт как для чтения, так и для записи.
mapped byte buffer, возвращаемый этим методом, будет иметь положение 0 и лимит и емкость size; его метка будет неопределенной. Буфер и отображение, которое он представляет, останутся действительными до тех пор, пока сам буфер не будет собран сборщиком мусора.
После создания отображение не зависит от файла канала, который использовался для его создания. Закрытие канала, в частности, не влияет на действительность отображения.
Многие детали отображения файлов в памяти по своей природе зависят от базовой операционной системы и поэтому не определены. Поведение этого метода, когда запрашиваемая область не полностью содержится в файле этого канала, не определено. Определено ли, что изменения, внесенные в содержимое или размер базового файла этой программой или другой, переносятся в буфер, не определено. Скорость, с которой изменения буфера переносятся в файл, не определена.
На большинстве операционных систем отображение файла в память дороже, чем чтение или запись нескольких десятков килобайт данных с помощью обычных методов read и write. С точки зрения производительности, обычно это имеет смысл только для отображения относительно больших файлов в памяти.
- Параметры:
-
mode- Один из константREAD_ONLY,READ_WRITEилиPRIVATE, определённых в классеFileChannel.MapMode, в зависимости от того, будет ли файл отображаться только для чтения, для чтения/записи или в режиме «только для чтения» (copy-on-write), соответственно -
position- Позиция в файле, с которой начинается отображаемый регион; должна быть неотрицательной -
size- Размер отображаемого региона; должен быть неотрицательным и не превышатьInteger.MAX_VALUE - Возвращает:
- Отображаемый буфер байтов
- Исключение:
-
NonReadableChannelException- ЕслиmodeравенREAD_ONLY, но этот канал не был открыт для чтения -
NonWritableChannelException- ЕслиmodeравенREAD_WRITEилиPRIVATE, но этот канал не был открыт для чтения и записи -
IllegalArgumentException- Если предварительные условия для параметров не соблюдены -
IOException- Если произошла какая-либо другая ошибка ввода-вывода - См. также:
-
FileChannel.MapMode,MappedByteBuffer
lock
public abstract FileLock lock(long position,
long size,
boolean shared)
throws IOException Захватывает блокировку заданного региона файла этого канала.
Вызов этого метода будет блокировать выполнение, пока регион не будет заблокирован, канал не будет закрыт или вызывающая нить не будет прервана — в зависимости от того, что произойдёт раньше.
Если другой поток закрывает этот канал во время вызова этого метода, будет выброшено исключение AsynchronousCloseException.
Если вызывающая нить прерывается, ожидая получения блокировки, её статус прерывания будет установлен, и будет выброшено исключение FileLockInterruptionException. Если статус прерывания вызывающей нити установлен при вызове этого метода, то это исключение будет выброшено немедленно; статус прерывания нити не будет изменён.
Регион, указанный параметрами position и size, не обязательно должен находиться внутри или даже перекрывать фактический подлежащий файл. Регионы блокировки имеют фиксированный размер; если заблокированный регион изначально содержит конец файла, а файл увеличивается за пределы региона, то новая часть файла не будет охвачена блокировкой. Если ожидается увеличение размера файла и требуется блокировка всего файла, то должен быть заблокирован регион, начинающийся с нуля и не меньше ожидаемого максимального размера файла. Метод lock() без аргументов просто блокирует регион размером Long.MAX_VALUE.
Некоторые операционные системы не поддерживают общие блокировки, в таком случае запрос на общую блокировку автоматически преобразуется в запрос на эксклюзивную блокировку. Возможность проверки того, является ли приобретённая блокировка общей или эксклюзивной, можно осуществить вызовом метода 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.
Некоторые операционные системы не поддерживают общие блокировки, в таком случае запрос на общую блокировку автоматически преобразуется в запрос на эксклюзивную блокировку. Возможность проверки того, является ли приобретённая блокировка общей или эксклюзивной, можно осуществить вызовом метода isShared объекта полученной блокировки.
Блокировки файлов поддерживаются от имени всей виртуальной машины Java. Они не подходят для управления доступом к файлу несколькими потоками в одной и той же виртуальной машине.
- Параметры:
-
position- Позиция, с которой начинается заблокированный регион; должна быть неотрицательной -
size- Размер заблокированного региона; должен быть неотрицательным, и суммаposition+sizeдолжна быть неотрицательной -
shared-trueдля запроса общей блокировки,falseдля запроса эксклюзивной блокировки - Возвращает:
- Объект блокировки, представляющий приобретённую блокировку, или
nullесли блокировка не могла быть приобретена, потому что другая программа удерживает перекрывающуюся блокировку - Исключение:
-
IllegalArgumentException- Если предварительные условия для параметров не соблюдены -
ClosedChannelException- Если этот канал закрыт -
OverlappingFileLockException- Если блокировка, которая перекрывает запрашиваемый регион, уже удерживается этой виртуальной машиной Java, или если другой поток уже заблокирован в этом методе и пытается заблокировать перекрывающий регион того же файла -
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, или если другой поток уже заблокирован в этом методе и пытается заблокировать перекрывающий регион -
IOException- Если произошла какая-либо другая ошибка ввода-вывода - См. также:
-
lock(),lock(long,long,boolean),tryLock(long,long,boolean)
© 1993, 2020, Oracle and/or its affiliates. All rights reserved.
Documentation extracted from Debian's OpenJDK Development Kit package.
Licensed under the GNU General Public License, version 2, with the Classpath Exception.
Various third party code in OpenJDK is licensed under different licenses (see Debian package).
Java and OpenJDK are trademarks or registered trademarks of Oracle and/or its affiliates.