Класс 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 Методы, объявленные в классе java.lang.Object
clone, equals, finalize, getClass, hashCode, notify, notifyAll, toString, wait, wait, wait Методы, объявленные в интерфейсе java.nio.channels.Channel
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в соответствии с тем, должен ли файл быть сопоставлен для чтения только, чтения/записи или для частного (копирование при записи) доступа, соответственно -
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.
https://docs.oracle.com/en/java/javase/11/docs/api/java.base/java/nio/channels/FileChannel.html