- 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
时,文件的大小会减小。 该文件还可以具有一些关联的元数据,例如访问权限,内容类型和最后修改时间; 此类未定义元数据访问的方法。除了熟悉的字节通道的读,写和关闭操作外,该类还定义了以下特定于文件的操作:
文件的一个区域可以直接进入内存
mapped
; 对于大文件,这通常比调用通常的read
或write
方法更有效。对文件所做的更新可能是
forced out
到底层存储设备,确保在系统崩溃时数据不会丢失。字节可以从文件
to some other channel
和vice versa
传输 ,其方式可以由许多操作系统优化为直接进出文件系统高速缓存的非常快速的传输。文件的某个区域可能是
locked
,以防其他程序访问。
文件通道可供多个并发线程使用。 可以随时调用
close
方法,如Channel
接口所指定。 在任何给定时间,只有一个涉及通道位置或可以更改其文件大小的操作可能正在进行中; 在第一个操作仍在进行时尝试启动第二个此类操作将阻塞,直到第一个操作完成。 其他操作,特别是那些采取明确立场的操作,可以同时进行; 他们实际上是否这样做取决于基本的实施,因此没有具体说明。由此类实例提供的文件视图保证与同一程序中其他实例提供的同一文件的其他视图一致。 然而,由于底层操作系统执行的高速缓存和网络文件系统协议引起的延迟,该类实例提供的视图可能会也可能不会与其他同时运行的程序所看到的视图一致。 无论编写这些其他程序的语言是什么,以及它们是在同一台机器上运行还是在其他机器上运行,都是如此。 任何此类不一致的确切性质都取决于系统,因此未指定。
通过调用此类定义的
open
方法之一来创建文件通道。 的文件信道也可以从现有的获得FileInputStream
,FileOutputStream
,或RandomAccessFile
对象通过调用该对象的getChannel
方法,它返回被连接到相同的基本文件的文件信道。 在从现有流或随机访问文件获得文件通道的情况下,文件通道的状态与其getChannel
方法返回通道的对象的状态紧密相关。 无论是显式地还是通过读取或写入字节来改变通道的位置,都将改变原始对象的文件位置,反之亦然。 通过文件通道更改文件的长度将改变通过原始对象看到的长度,反之亦然。 通过写入字节来更改文件的内容将更改原始对象看到的内容,反之亦然。在不同的点上,该类指定需要“打开以供阅读”,“打开以进行写入”或“打开以进行读写”的实例。 通过
FileInputStream
实例的getChannel
方法获得的通道将打开以供阅读。 通过FileOutputStream
实例的getChannel
方法获得的通道将打开以进行写入。 最后,通过所获得的信道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
-
-
-
-
方法详细信息
-
open
public static FileChannel open(Path path, Set<? extends OpenOption> options, FileAttribute<?>... attrs) throws IOException
打开或创建文件,返回文件通道以访问该文件。options
参数确定文件的打开方式。READ
和WRITE
选项确定是否应打开文件以进行读取和/或写入。 如果数组中都没有包含任何选项(或APPEND
选项),则打开文件进行读取。 默认情况下,在文件开头处开始读取或写入。除了
additional options Option DescriptionREAD
和WRITE
,还可能出现以下选项:APPEND
If this option is present then the file is opened for writing and each invocation of the channel'swrite
method first advances the position to the end of the file and then writes the requested data. Whether the advancement of the position and the writing of the data are done in a single atomic operation is system-dependent and therefore unspecified. This option may not be used in conjunction with theREAD
orTRUNCATE_EXISTING
options.TRUNCATE_EXISTING
If this option is present then the existing file is truncated to a size of 0 bytes. This option is ignored when the file is opened only for reading.CREATE_NEW
If this option is present then a new file is created, failing if the file already exists. When creating a file the check for the existence of the file and the creation of the file if it does not exist is atomic with respect to other file system operations. This option is ignored when the file is opened only for reading.CREATE
If this option is present then an existing file is opened if it exists, otherwise a new file is created. When creating a file the check for the existence of the file and the creation of the file if it does not exist is atomic with respect to other file system operations. This option is ignored if theCREATE_NEW
option is also present or the file is opened only for reading.DELETE_ON_CLOSE
When this option is present then the implementation makes a best effort attempt to delete the file when closed by theclose
method. If theclose
method is not invoked then a best effort attempt is made to delete the file when the Java virtual machine terminates.SPARSE
When creating a new file this option is a hint that the new file will be sparse. This option is ignored when not creating a new file.SYNC
Requires that every update to the file's content or metadata be written synchronously to the underlying storage device. (see Synchronized I/O file integrity).DSYNC
Requires that every update to the file's content be written synchronously to the underlying storage device. (see Synchronized I/O file integrity).实现还可以支持其他选项。
attrs
参数是文件file-attributes
的可选数组,用于在创建文件时以原子方式设置。新的信道是通过调用创建
newFileChannel
上创建该提供商方法Path
。- 参数
-
path
- 要打开或创建的文件的路径 -
options
- 指定文件打开方式的选项 -
attrs
- 创建文件时要自动设置的文件属性的可选列表 - 结果
- 一个新的文件通道
- 异常
-
IllegalArgumentException
- 如果集合包含无效的选项组合 -
UnsupportedOperationException
- 如果path
与不支持创建文件通道的提供程序关联,或者指定了不支持的打开选项,或者该数组包含在创建文件时无法原子设置的属性 -
IOException
- 如果发生I / O错误 -
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
- 如果发生I / O错误 -
SecurityException
- 如果安装了安全管理器,它将拒绝实现所需的未指定权限。 对于默认提供程序,如果打开文件进行读取,则调用SecurityManager.checkRead(String)
方法来检查读取访问权限。 如果打开文件进行写入,则调用SecurityManager.checkWrite(String)
方法来检查写访问 - 从以下版本开始:
- 1.7
-
read
public abstract int read(ByteBuffer dst) throws IOException
从该通道读取一个字节序列到给定的缓冲区。从该通道的当前文件位置开始读取字节,然后使用实际读取的字节数更新文件位置。 否则,此方法的行为与
ReadableByteChannel
接口中指定的完全相同 。- Specified by:
-
read
在接口ReadableByteChannel
- Specified by:
-
read
在界面SeekableByteChannel
- 参数
-
dst
- 要传输字节的缓冲区 - 结果
-
如果通道已到达流末尾,则读取的字节数(可能为零)或
-1
- 异常
-
ClosedChannelException
- 如果此渠道已关闭 -
AsynchronousCloseException
- 如果另一个线程在读取操作正在进行时关闭此通道 -
ClosedByInterruptException
- 如果另一个线程在读操作正在进行时中断当前线程,从而关闭通道并设置当前线程的中断状态 -
IOException
- 如果发生其他一些I / O错误
-
read
public abstract long read(ByteBuffer[] dsts, int offset, int length) throws IOException
从该通道读取一系列字节到给定缓冲区的子序列。从该通道的当前文件位置开始读取字节,然后使用实际读取的字节数更新文件位置。 否则,此方法的行为与
ScatteringByteChannel
接口中指定的完全相同 。- Specified by:
-
read
在接口ScatteringByteChannel
- 参数
-
dsts
- 要传输字节的缓冲区 -
offset
- 要传输字节的第一个缓冲区的缓冲区数组内的偏移量; 必须是非负数且不大于dsts.length
-
length
- 要访问的最大缓冲区数; 必须是非负数且不大于dsts.length
-offset
- 结果
-
如果通道已到达流末尾,则读取的字节数(可能为零)或
-1
- 异常
-
ClosedChannelException
- 如果此渠道已关闭 -
AsynchronousCloseException
- 如果另一个线程在读取操作正在进行时关闭此通道 -
ClosedByInterruptException
- 如果另一个线程在读操作正在进行时中断当前线程,从而关闭通道并设置当前线程的中断状态 -
IOException
- 如果发生其他一些I / O错误
-
read
public final long read(ByteBuffer[] dsts) throws IOException
从该通道读取一系列字节到给定的缓冲区。从该通道的当前文件位置开始读取字节,然后使用实际读取的字节数更新文件位置。 否则,此方法的行为与
ScatteringByteChannel
接口中指定的完全相同 。- Specified by:
-
read
在接口ScatteringByteChannel
- 参数
-
dsts
- 要传输字节的缓冲区 - 结果
-
如果通道已到达流末尾,则读取的字节数(可能为零)或
-1
- 异常
-
ClosedChannelException
- 如果此渠道已关闭 -
AsynchronousCloseException
- 如果另一个线程在读取操作正在进行时关闭此通道 -
ClosedByInterruptException
- 如果另一个线程在读操作正在进行时中断当前线程,从而关闭通道并设置当前线程的中断状态 -
IOException
- 如果发生其他一些I / O错误
-
write
public abstract int write(ByteBuffer src) throws IOException
从给定缓冲区向该通道写入一个字节序列。除非通道处于附加模式,否则从该通道的当前文件位置开始写入字节,在这种情况下,位置首先前进到文件的末尾。 如有必要,文件将生长以容纳写入的字节,然后使用实际写入的字节数更新文件位置。 否则,此方法的行为与
WritableByteChannel
接口指定的完全相同 。- Specified by:
-
write
在接口SeekableByteChannel
- Specified by:
-
write
,界面WritableByteChannel
- 参数
-
src
- 要从中检索字节的缓冲区 - 结果
- 写入的字节数,可能为零
- 异常
-
ClosedChannelException
- 如果此渠道已关闭 -
AsynchronousCloseException
- 如果另一个线程在写操作正在进行时关闭此通道 -
ClosedByInterruptException
- 如果另一个线程在写操作正在进行时中断当前线程,从而关闭通道并设置当前线程的中断状态 -
IOException
- 如果发生其他一些I / O错误
-
write
public abstract long write(ByteBuffer[] srcs, int offset, int length) throws IOException
从给定缓冲区的子序列向该通道写入一个字节序列。除非通道处于附加模式,否则从该通道的当前文件位置开始写入字节,在这种情况下,位置首先前进到文件的末尾。 如有必要,文件将生长以容纳写入的字节,然后使用实际写入的字节数更新文件位置。 否则,此方法的行为与
GatheringByteChannel
接口中指定的完全相同 。- Specified by:
-
write
在界面GatheringByteChannel
- 参数
-
srcs
- 要从中检索字节的缓冲区 -
offset
- 要从中检索字节的第一个缓冲区的缓冲区数组中的偏移量; 必须是非负数且不大于srcs.length
-
length
- 要访问的最大缓冲区数; 必须是非负数且不大于srcs.length
-offset
- 结果
- 写入的字节数,可能为零
- 异常
-
ClosedChannelException
- 如果此渠道已关闭 -
AsynchronousCloseException
- 如果另一个线程在写入操作正在进行时关闭此通道 -
ClosedByInterruptException
- 如果另一个线程在写操作正在进行时中断当前线程,从而关闭通道并设置当前线程的中断状态 -
IOException
- 如果发生其他一些I / O错误
-
write
public final long write(ByteBuffer[] srcs) throws IOException
从给定的缓冲区向该通道写入一个字节序列。除非通道处于附加模式,否则从该通道的当前文件位置开始写入字节,在这种情况下,位置首先前进到文件的末尾。 如有必要,文件将生长以容纳写入的字节,然后使用实际写入的字节数更新文件位置。 否则,此方法的行为与
GatheringByteChannel
接口中指定的完全相同 。- Specified by:
-
write
在接口GatheringByteChannel
- 参数
-
srcs
- 要从中检索字节的缓冲区 - 结果
- 写入的字节数,可能为零
- 异常
-
ClosedChannelException
- 如果此渠道已关闭 -
AsynchronousCloseException
- 如果另一个线程在写操作正在进行时关闭此通道 -
ClosedByInterruptException
- 如果另一个线程在写操作正在进行时中断当前线程,从而关闭通道并设置当前线程的中断状态 -
IOException
- 如果发生其他一些I / O错误
-
position
public abstract long position() throws IOException
返回此通道的文件位置。- Specified by:
-
position
,界面SeekableByteChannel
- 结果
- 此通道的文件位置,一个非负整数,计算从文件开头到当前位置的字节数
- 异常
-
ClosedChannelException
- 如果此渠道已关闭 -
IOException
- 如果发生其他一些I / O错误
-
position
public abstract FileChannel position(long newPosition) throws IOException
设置此通道的文件位置。将位置设置为大于文件当前大小的值是合法的,但不会更改文件的大小。 稍后尝试在这样的位置读取字节将立即返回文件结束指示。 稍后尝试在这样的位置写入字节将导致文件增长以容纳新字节; 未指定前一个文件结尾和新写入字节之间的任何字节的值。
- Specified by:
-
position
,界面SeekableByteChannel
- 参数
-
newPosition
- 新位置,一个非负整数,用于计算文件开头的字节数 - 结果
- 这个文件频道
- 异常
-
ClosedChannelException
- 如果此渠道已关闭 -
IllegalArgumentException
- 如果新头寸为负数 -
IOException
- 如果发生其他一些I / O错误
-
size
public abstract long size() throws IOException
返回此通道文件的当前大小。- Specified by:
-
size
在界面SeekableByteChannel
- 结果
- 此通道文件的当前大小,以字节为单位
- 异常
-
ClosedChannelException
- 如果此渠道已关闭 -
IOException
- 如果发生其他一些I / O错误
-
truncate
public abstract FileChannel truncate(long size) throws IOException
将此频道的文件截断为给定大小。如果给定大小小于文件的当前大小,则文件将被截断,丢弃文件新端之外的任何字节。 如果给定大小大于或等于文件的当前大小,则不修改该文件。 在任何一种情况下,如果此通道的文件位置大于给定大小,则将其设置为该大小。
- Specified by:
-
truncate
在接口SeekableByteChannel
- 参数
-
size
- 新大小,非负字节数 - 结果
- 这个文件频道
- 异常
-
NonWritableChannelException
- 如果未打开此频道进行写入 -
ClosedChannelException
- 如果此渠道已关闭 -
IllegalArgumentException
- 如果新大小为负数 -
IOException
- 如果发生其他一些I / O错误
-
force
public abstract void force(boolean metaData) throws IOException
强制将此通道文件的任何更新写入包含它的存储设备。如果此通道的文件驻留在本地存储设备上,则当此方法返回时,保证自创建此通道以来对文件所做的所有更改,或者自上次调用此方法以来,该文件都将写入该设备。 这对于确保在系统崩溃时不会丢失关键信息非常有用。
如果文件不驻留在本地设备上,则不会进行此类保证。
metaData
参数可用于限制此方法需要执行的I / O操作数。 为此参数传递false
表示只需要将文件内容的更新写入存储; 传递true
表示必须写入文件内容和元数据的更新,这通常需要至少一次I / O操作。 此参数是否实际具有任何效果取决于底层操作系统,因此未指定。即使仅打开通道进行读取,调用此方法也可能导致I / O操作发生。 例如,某些操作系统将最后访问时间作为文件元数据的一部分进行维护,并且每次读取文件时都会更新此时间。 这是否实际完成是依赖于系统的,因此未指定。
此方法仅保证强制通过此类中定义的方法对此通道的文件进行更改。 它可能会也可能不会强制通过修改通过调用
map
方法获得的mapped byte buffer
的内容进行更改 。 调用映射字节缓冲区的force
方法将强制写入对缓冲区内容的更改。- 参数
-
metaData
- 如果是true
则需要使用此方法强制更改文件的内容和要写入存储的元数据; 否则,只需强制内容更改即可写入 - 异常
-
ClosedChannelException
- 如果此渠道已关闭 -
IOException
- 如果发生其他一些I / O错误
-
transferTo
public abstract long transferTo(long position, long count, WritableByteChannel target) throws IOException
将字节从此通道的文件传输到给定的可写字节通道。尝试从该通道文件中的给定
position
开始读取最多count
个字节,并将它们写入目标通道。 调用此方法可能会也可能不会传输所有请求的字节; 是否这样做取决于渠道的性质和状态。 如果此通道的文件包含从给定的position
开始的少于count
字节,或者目标通道是非阻塞且其输出缓冲区中的count
字节少于position
,则传输的字节数少于所请求的字节数。此方法不会修改此通道的位置。 如果给定位置大于文件的当前大小,则不传输任何字节。 如果目标通道有一个位置,则从该位置开始写入字节,然后该位置按写入的字节数递增。
此方法可能比从此通道读取并写入目标通道的简单循环更有效。 许多操作系统可以直接从文件系统缓存向目标通道传输字节,而无需实际复制它们。
- 参数
-
position
- 文件在转移开始时的位置; 必须是非负面的 -
count
- 要传输的最大字节数; 必须是非负面的 -
target
- 目标通道 - 结果
- 实际传输的字节数,可能为零
- 异常
-
IllegalArgumentException
- 如果参数的前提条件不成立 -
NonReadableChannelException
- 如果未打开此频道进行阅读 -
NonWritableChannelException
- 如果未打开目标通道进行写入 -
ClosedChannelException
- 如果此通道或目标通道关闭 -
AsynchronousCloseException
- 如果另一个线程在传输过程中关闭了任一通道 -
ClosedByInterruptException
- 如果另一个线程在传输过程中中断当前线程,从而关闭两个通道并设置当前线程的中断状态 -
IOException
- 如果发生其他一些I / O错误
-
transferFrom
public abstract long transferFrom(ReadableByteChannel src, long position, long count) throws IOException
从给定的可读字节通道将字节传输到此通道的文件中。尝试从源通道读取最多
count
个字节,并从给定的position
开始将它们写入此通道的文件。 调用此方法可能会也可能不会传输所有请求的字节; 是否这样做取决于渠道的性质和状态。 如果源通道剩余少于count
个字节,或者源通道非阻塞且输入缓冲区中立即可用的字节数少于count
少于count
字节数。此方法不会修改此通道的位置。 如果给定位置大于文件的当前大小,则不传输任何字节。 如果源通道有一个位置,则从该位置开始读取字节,然后将位置增加读取的字节数。
此方法可能比从源通道读取并写入此通道的简单循环更有效。 许多操作系统可以直接从源通道将字节传输到文件系统缓存中,而无需实际复制它们。
- 参数
-
src
- 源通道 -
position
- 文件在转移开始时的位置; 必须是非负面的 -
count
- 要传输的最大字节数; 必须是非负面的 - 结果
- 实际传输的字节数,可能为零
- 异常
-
IllegalArgumentException
- 如果参数的前提条件不成立 -
NonReadableChannelException
- 如果未打开源通道进行读取 -
NonWritableChannelException
- 如果未打开此频道进行写入 -
ClosedChannelException
- 如果此通道或源通道关闭 -
AsynchronousCloseException
- 如果另一个线程在传输过程中关闭了任一通道 -
ClosedByInterruptException
- 如果另一个线程在传输过程中中断当前线程,从而关闭两个通道并设置当前线程的中断状态 -
IOException
- 如果发生其他一些I / O错误
-
read
public abstract int read(ByteBuffer dst, long position) throws IOException
从给定文件位置开始,从该通道读取一个字节序列到给定缓冲区。此方法的工作方式与
read(ByteBuffer)
方法相同,不同之处在于从给定文件位置开始而不是在通道的当前位置读取字节。 此方法不会修改此通道的位置。 如果给定位置大于文件的当前大小,则不读取任何字节。- 参数
-
dst
- 要传输字节的缓冲区 -
position
- 要开始传输的文件位置; 必须是非负面的 - 结果
-
如果给定位置大于或等于文件的当前大小,则读取的字节数(可能为零)或
-1
- 异常
-
IllegalArgumentException
- 如果头寸为负数 -
NonReadableChannelException
- 如果未打开此频道进行阅读 -
ClosedChannelException
- 如果此渠道已关闭 -
AsynchronousCloseException
- 如果另一个线程在读操作正在进行时关闭此通道 -
ClosedByInterruptException
- 如果另一个线程在读操作正在进行时中断当前线程,从而关闭通道并设置当前线程的中断状态 -
IOException
- 如果发生其他一些I / O错误
-
write
public abstract int write(ByteBuffer src, long position) throws IOException
从给定的缓冲区向该通道写入一个字节序列,从给定的文件位置开始。此方法的工作方式与
write(ByteBuffer)
方法相同,不同之处在于从给定文件位置开始而不是在通道的当前位置开始写入字节。 此方法不会修改此通道的位置。 如果给定位置大于文件的当前大小,则文件将增长以容纳新字节; 未指定前一个文件结尾和新写入字节之间的任何字节的值。- 参数
-
src
- 要从中传输字节的缓冲区 -
position
- 传输开始的文件位置; 必须是非负面的 - 结果
- 写入的字节数,可能为零
- 异常
-
IllegalArgumentException
- 如果头寸为负数 -
NonWritableChannelException
- 如果未打开此频道进行写入 -
ClosedChannelException
- 如果此渠道已关闭 -
AsynchronousCloseException
- 如果另一个线程在写操作正在进行时关闭此通道 -
ClosedByInterruptException
- 如果另一个线程在写操作正在进行时中断当前线程,从而关闭通道并设置当前线程的中断状态 -
IOException
- 如果发生其他一些I / O错误
-
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
的位置为零,限制和容量为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
- 如果发生其他一些I / O错误 - 另请参见:
-
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
- 如果发生其他一些I / O错误 - 另请参见:
-
lock()
,tryLock()
,tryLock(long,long,boolean)
-
lock
public final FileLock lock() throws IOException
- 结果
- 表示新获取的锁的锁对象
- 异常
-
ClosedChannelException
- 如果此渠道已关闭 -
AsynchronousCloseException
- 如果在此方法中阻止调用线程,则另一个线程关闭此通道 -
FileLockInterruptionException
- 如果在此方法中阻止调用线程被中断 -
OverlappingFileLockException
- 如果此Java虚拟机已经拥有与所请求区域重叠的锁,或者此方法中已阻止另一个线程并且正在尝试锁定同一文件的重叠区域 -
NonWritableChannelException
- 如果未打开此频道进行写入 -
IOException
- 如果发生其他一些I / O错误 - 另请参见:
-
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
- 如果发生其他一些I / O错误 - 另请参见:
-
lock()
,lock(long,long,boolean)
,tryLock()
-
tryLock
public final FileLock tryLock() throws IOException
- 结果
-
表示新获取的锁的锁对象,如果由于另一个程序持有重叠锁而无法获取锁,
null
- 异常
-
ClosedChannelException
- 如果此渠道已关闭 -
OverlappingFileLockException
- 如果此Java虚拟机已经拥有与所请求区域重叠的锁,或者此方法中已阻止另一个线程并且正在尝试锁定重叠区域 -
IOException
- 如果发生其他一些I / O错误 - 另请参见:
-
lock()
,lock(long,long,boolean)
,tryLock(long,long,boolean)
-
-