public abstract class AsynchronousFileChannel extends Object implements AsynchronousChannel
异步文件通道时创建的文件是通过调用一个该类定义的方法打开open
。该文件包含一个可变长度的字节,可以读写和电流大小的序列可以queried
。该文件的大小增加时,字节被写入超出其当前的大小;文件的尺寸减小,当它truncated
。
异步文件通道不在文件中有一个当前位置。相反,将文件位置指定给启动异步操作的每个读写方法。一个CompletionHandler
被指定为一个参数调用消耗的I/O操作的结果。这类还定义了读写的方法,启动异步操作,返回一个Future
代表待操作的结果。如果可能的Future
操作完成用于检查,等待其完成,并检索结果。
除了读和写操作,这个类定义了以下操作:
对一个文件做更新可能forced out
对底层的存储设备,保证数据不会丢失,在系统崩溃时。
一个文件的一个区域可能locked
反对由其他程序访问。
一个AsynchronousFileChannel
是与一个线程池,任务提交到处理I/O事件处理程序和调度完成消费结果的I/O操作的通道。在一个通道上发起的一个I / O操作的完成处理程序保证被线程池中的一个线程调用(这保证了完成处理程序是由一个线程与预期的身份运行的)。当一个I / O操作立即完成时,启动线程本身是线程池中的一个线程,然后完成处理程序可以直接调用启动线程。当一个AsynchronousFileChannel
创建没有指定一个线程池,然后通道与系统相关的默认线程池,可以与其他渠道共享相关。默认的线程池是由AsynchronousChannelGroup
类定义系统属性配置。
这种类型的信道是安全的,用于多个并发线程。的close
方法可以在任何时候调用,由Channel
指定界面。这使得所有优秀的异步操作的通道来完成与例外AsynchronousCloseException
。多读和写操作可能会在同一时间。当多个读写操作是突出的,然后订购的I / O操作,并调用完成处理程序的命令,没有指定,他们不是,特别是保证执行的顺序,该操作开始。当读或写的ByteBuffers
用于多个并发I/O操作是不安全的。此外,在一个I / O操作被启动,然后应注意,以确保缓冲区是不访问,直到操作完成后。
作为一个文件FileChannel
,通过这个类的实例提供的视图是可以用在同一个程序的其他实例提供的相同文件的其他意见一致。由这个类的一个实例提供的视图可能或可能不会,但是,与其他并发运行程序所看到的视图,由于底层的操作系统和网络文件系统协议的延迟所看到的视图是一致的。这是真的,不管这些其他程序的语言是写的,以及它们是否在同一台机器上运行,或在其他机器上运行的语言。任何这样的不一致的确切性质是系统依赖性,因此未指定。
Modifier | Constructor and Description |
---|---|
protected |
AsynchronousFileChannel()
初始化该类的一个新实例。
|
Modifier and Type | Method and Description |
---|---|
abstract void |
force(boolean metaData)
强制将此通道的文件写入到包含它的存储设备上的任何更新。
|
Future<FileLock> |
lock()
获取此通道文件上的互斥锁。
|
<A> void |
lock(A attachment, CompletionHandler<FileLock,? super A> handler)
获取此通道文件上的互斥锁。
|
abstract Future<FileLock> |
lock(long position, long size, boolean shared)
获取此通道文件的指定区域上的锁。
|
abstract <A> void |
lock(long position, long size, boolean shared, A attachment, CompletionHandler<FileLock,? super A> handler)
获取此通道文件的指定区域上的锁。
|
static AsynchronousFileChannel |
open(Path file, OpenOption... options)
打开或创建一个用于读取和/或写入的文件,返回一个异步文件通道来访问该文件。
|
static AsynchronousFileChannel |
open(Path file, Set<? extends OpenOption> options, ExecutorService executor, FileAttribute<?>... attrs)
打开或创建一个用于读取和/或写入的文件,返回一个异步文件通道来访问该文件。
|
abstract Future<Integer> |
read(ByteBuffer dst, long position)
从这个通道读取一个字节序列到给定的缓冲区,从给定的文件位置开始。
|
abstract <A> void |
read(ByteBuffer dst, long position, A attachment, CompletionHandler<Integer,? super A> handler)
从这个通道读取一个字节序列到给定的缓冲区,从给定的文件位置开始。
|
abstract long |
size()
返回此通道文件的当前大小。
|
abstract AsynchronousFileChannel |
truncate(long size)
将这一渠道的文件的大小。
|
FileLock |
tryLock()
试图在这个通道的文件上获得独占锁。
|
abstract FileLock |
tryLock(long position, long size, boolean shared)
试图获取此通道文件的指定区域上的锁的尝试。
|
abstract Future<Integer> |
write(ByteBuffer src, long position)
从给定的缓冲区中从给定的缓冲区中写入一个字节序列,从给定的文件位置开始。
|
abstract <A> void |
write(ByteBuffer src, long position, A attachment, CompletionHandler<Integer,? super A> handler)
从给定的缓冲区中从给定的缓冲区中写入一个字节序列,从给定的文件位置开始。
|
clone, equals, finalize, getClass, hashCode, notify, notifyAll, toString, wait, wait, wait
close
public static AsynchronousFileChannel open(Path file, Set<? extends OpenOption> options, ExecutorService executor, FileAttribute<?>... attrs) throws IOException
的options
参数决定如何打开该文件。的READ
和WRITE
选项确定文件是否应该打开阅读或写作。如果两个选项都包含在数组中,则打开一个现有的文件,用于阅读。
除了READ
和WRITE
,下列选项中可能存在:
Option | 描述 |
---|---|
TRUNCATE_EXISTING |
When opening an existing file, the file is first 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 the CREATE_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 the the close method. If the close 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). |
一个实现也可以支持额外的选项。
的executor
参数是ExecutorService
,任务提交到处理I/O事件,导致渠道发起的操作调度完成结果。这些任务的本质是高度具体实施等护理时应配置Executor
。至少它应该支持无限的工作队列和运行不应该对execute
方法调用者线程的任务。关闭执行人服务,而渠道是开放的结果在未指定的行为。
的attrs
参数是一个可选的文件file-attributes
阵列设置自动创建文件时。
新的渠道是通过调用创建Path
提供者的newFileChannel
方法创建。
file
-打开或创建的文件的路径
options
选项指定如何打开文件
executor
-线程池或
null
联想渠道与默认的线程池
attrs
-文件的可选列表属性设置自动创建文件时
IllegalArgumentException
如果集包含一个无效的组合选择
UnsupportedOperationException
-如果
file
与提供程序不支持创建异步文件通道相关的,或不支持的开放式选项指定,或者数组包含一个属性不能设置自动创建文件时
IOException
如果I/O错误发生
SecurityException
如果安全管理器安装,它否认未指定许可的实施要求。在默认的提供程序的情况下,该
SecurityManager.checkRead(String)
方法被调用来检查读访问如果文件打开阅读。的
SecurityManager.checkWrite(String)
方法被调用来检查写访问如果文件打开写作
public static AsynchronousFileChannel open(Path file, OpenOption... options) throws IOException
此方法的调用与调用的方式完全相同的行为
ch.open
(文件、选择、空、新fileattribute <?> [ 0 ]);
哪里
opts
是
Set
含有指定此方法的选择。
由此产生的信道与默认线程池关联,其中的任务被提交来处理I / O事件,并调度到消耗的异步操作的结果在得到的信道上的完成的处理程序。
file
-打开或创建的文件的路径
options
选项指定如何打开文件
IllegalArgumentException
如果集包含一个无效的组合选择
UnsupportedOperationException
-如果
file
与提供程序不支持创建文件通道相关的,或不支持的开放式选项指定
IOException
如果I/O错误发生
SecurityException
如果安全管理器安装,它否认未指定许可的实施要求。在默认的提供程序的情况下,该
SecurityManager.checkRead(String)
方法被调用来检查读访问如果文件打开阅读。的
SecurityManager.checkWrite(String)
方法被调用来检查写访问如果文件打开写作
public abstract long size() throws IOException
ClosedChannelException
-如果这通道关闭
IOException
-如果其他I/O错误发生
public abstract AsynchronousFileChannel truncate(long size) throws IOException
如果给定的大小小于文件的当前大小,则文件被截断,丢弃超出文件新结束的任何字节。如果给定的大小大于或等于该文件的当前大小,则该文件不被修改。
size
-新的大小,一个非负的字节数
NonWritableChannelException
-如果这个渠道没有打开写作
ClosedChannelException
-如果这通道关闭
IllegalArgumentException
-如果新的大小负
IOException
-如果其他I/O错误发生
public abstract void force(boolean metaData) throws IOException
如果这个通道的文件驻留在本地存储设备上,那么当这个方法返回时,保证所有对文件的更改,因为这个通道被创建,或者因为这个方法是最后一次调用,将被写入该设备。这是有用的,以确保关键信息不会丢失在系统崩溃的事件。
如果该文件不驻留在本地设备上,则没有这样的保证。
的metaData
参数可用于限制数量的I/O操作,这种方法要求执行。这个参数传递false
表明只有更新文件的内容需要被写入存储;通过true
表示文件的内容和元数据的更新必须是书面的,通常至少需要一个I/O操作。是否这个参数实际上有任何效果取决于底层的操作系统,因此是未指定的。
调用此方法可能会导致一个I / O操作发生,即使该通道只打开阅读。例如,一些操作系统维护一个文件的元数据的最后一个访问时间,而这个时间是在每次读取文件时更新的。是否真的这样做是系统依赖,因此,未指定。
此方法只保证通过在这个类中定义的方法来强制对这个通道的文件进行更改。
metaData
-如果
true
将这一方法需要迫使更改文件的内容和元数据都被写入到存储;否则,它只需要力的含量变化来写
ClosedChannelException
-如果这通道关闭
IOException
-如果其他I/O错误发生
public abstract <A> void lock(long position, long size, boolean shared, A attachment, CompletionHandler<FileLock,? super A> handler)
此方法启动一个操作以获取此通道文件的指定区域上的锁的操作。的handler
参数完成处理被调用,当锁获得(或操作失败)。结果通过完成处理程序产生的FileLock
。
由position
和size
参数指定的区域不需要被包含在,甚至重叠,实际文件。锁定区域是固定大小的;如果一个锁定区域最初包含文件的结束,并且该文件将在该区域之外增长,那么该文件的新部分将不会被锁覆盖。如果一个文件预计将增长的大小和一个锁对整个文件是必需的,那么一个区域开始在零,并没有小于预期的最大大小的文件,应该被锁定。两参数lock(Object,CompletionHandler)
法简单的锁Long.MAX_VALUE
区域大小。如果一个锁重叠请求的区域已经被此java虚拟机举行,或这种方法已被用来锁定一个重叠区域,操作没有完成,那么这个方法抛出OverlappingFileLockException
。
一些操作系统不支持一种以异步方式获取文件锁的机制。因此,实现可以在后台线程中获取文件锁,也可以从关联的线程池中的线程执行的任务获取文件锁。如果有很多优秀的那么它可能消耗锁操作的线程在java虚拟机无限期。
一些操作系统不支持共享锁,在这种情况下,共享锁的请求会自动转换为互斥锁的请求。无论是新获得的锁是共享或独占可以通过调用产生的锁对象的isShared
法测试。
文件锁在整个java虚拟机举行代表。它们不适合在同一个虚拟机中的多个线程控制对一个文件的访问。
A
-附件的类型
position
-在锁定的区域是开始的位置;必须是非负数
size
-锁定区域的大小;必须是非负的,和
position
+
size
必须非负
shared
-
true
请求共享锁,在这种情况下,这个通道必须打开阅读(或写作);
false
请求独占锁,在这种情况下,这个通道必须打开写作(可能阅读)
attachment
-连接到I/O操作的对象;可以
null
handler
-消费结果的处理程序
OverlappingFileLockException
如果锁重叠请求的区域已经被此java虚拟机举行,或已经有一个正在试图锁定一个重叠区域
IllegalArgumentException
-如果在参数的前提条件不成立
NonReadableChannelException
-如果
shared
是真实的但是这个渠道没有打开阅读
NonWritableChannelException
-如果
shared
是假的但是这通道不打开写作
public final <A> void lock(A attachment, CompletionHandler<FileLock,? super A> handler)
此方法启动一个操作以获取此通道文件的指定区域上的锁的操作。的handler
参数完成处理被调用,当锁获得(或操作失败)。结果通过完成处理程序产生的FileLock
。
这种形式的ch.lock(att,handler)
方法调用的行为一样,调用
ch.lock
(0,long.max_value、虚假、ATT、处理)
A
-附件的类型
attachment
-连接到I/O操作的对象;可以
null
handler
-消费结果的处理程序
OverlappingFileLockException
如果锁已经被这个java虚拟机举行,或已经有一个正在试图锁定区域
NonWritableChannelException
-如果这个渠道没有打开写作
public abstract Future<FileLock> lock(long position, long size, boolean shared)
此方法启动一个操作以获取此通道文件的指定区域上的锁的操作。该方法具有完全相同的方式,但不是指定的lock(long, long, boolean, Object, CompletionHandler)
完成处理程序的方法,该方法返回一个Future
表示等待结果。的Future
的get
方法返回成功完成的FileLock
。
position
-在锁定的区域是开始的位置;必须是非负数
size
-锁定区域的大小;必须是非负的,和
position
+
size
必须非负
shared
-
true
请求共享锁,在这种情况下,这个通道必须打开阅读(或写作);
false
请求独占锁,在这种情况下,这个通道必须打开写作(可能阅读)
Future
对象
OverlappingFileLockException
如果锁已经被这个java虚拟机举行,或已经有一个正在试图锁定区域
IllegalArgumentException
-如果在参数的前提条件不成立
NonReadableChannelException
-如果
shared
是真实的但是这个渠道没有打开阅读
NonWritableChannelException
-如果
shared
是假的但是这通道不打开写作
public final Future<FileLock> lock()
此方法启动一个操作以获得此通道文件上的互斥锁。该方法返回一个Future
代表待操作的结果。的Future
的get
方法返回成功完成的FileLock
。
此方法的调用与调用的方式完全相同的行为
ch.lock
(0,long.max_value,假)
Future
表示等待结果
OverlappingFileLockException
如果锁已经被这个java虚拟机举行,或已经有一个正在试图锁定区域
NonWritableChannelException
-如果这个渠道没有打开写作
public abstract FileLock tryLock(long position, long size, boolean shared) throws IOException
此方法不阻塞。一个调用总是返回立即,无论是获得了请求的区域上的锁或没有这样做。如果得不到锁因为重叠的锁被另一个程序则返回null
。如果它未能获得任何其他原因的锁,则抛出一个适当的异常。
position
-在锁定的区域是开始的位置;必须是非负数
size
-锁定区域的大小;必须是非负的,和
position
+
size
必须非负
shared
-
true
请求共享锁,
false
请求独占锁
null
如果锁无法获得因为另一个程序是重叠的锁
IllegalArgumentException
-如果在参数的前提条件不成立
ClosedChannelException
-如果这通道关闭
OverlappingFileLockException
如果锁重叠请求的区域已经被此java虚拟机,或者如果另一个线程已经在这个方法封锁,试图锁定同一文件的重叠区域
NonReadableChannelException
-如果
shared
是真实的但是这个渠道没有打开阅读
NonWritableChannelException
-如果
shared
是假的但是这通道不打开写作
IOException
-如果其他I/O错误发生
lock(Object,CompletionHandler)
,
lock(long,long,boolean,Object,CompletionHandler)
,
tryLock()
public final FileLock tryLock() throws IOException
这种形式的ch.tryLock()
方法调用的行为一样,调用
ch.tryLock
(0,long.max_value,假)
null
如果锁无法获得因为另一个程序是重叠的锁
ClosedChannelException
-如果这通道关闭
OverlappingFileLockException
如果锁重叠请求的区域已经被此java虚拟机,或者如果另一个线程已经在这个方法封锁,试图锁定一个重叠区域
NonWritableChannelException
-如果
shared
是假的但是这通道不打开写作
IOException
-如果其他I/O错误发生
lock(Object,CompletionHandler)
,
lock(long,long,boolean,Object,CompletionHandler)
,
tryLock(long,long,boolean)
public abstract <A> void read(ByteBuffer dst, long position, A attachment, CompletionHandler<Integer,? super A> handler)
此方法启动从这个通道到给定缓冲区的一个字节序列的读取,从给定的文件位置开始。阅读的结果是读取到的字节数或-1
如果给定的位置大于或等于该文件的大小的时候,尝试读取。
这种方法以同样的方式为AsynchronousByteChannel.read(ByteBuffer,Object,CompletionHandler)
方法,除了字节读取从给定的文件位置。如果给定的文件位置大于读取时的文件大小,则没有读取字节数。
A
-附件的类型
dst
-缓冲区中的字节都被转移
position
转移开始文件位置;必须是非负数
attachment
-连接到I/O操作的对象;可以
null
handler
-消费结果的处理程序
IllegalArgumentException
-如果位置是负面或缓冲区是只读的
NonReadableChannelException
-如果这通道不打开阅读
public abstract Future<Integer> read(ByteBuffer dst, long position)
此方法启动从这个通道到给定缓冲区的一个字节序列的读取,从给定的文件位置开始。此方法返回一个Future
代表待操作的结果。的Future
的get
方法返回读取到的字节数或-1
如果给定的位置大于或等于该文件的大小的时候,尝试读取。
这种方法以同样的方式为AsynchronousByteChannel.read(ByteBuffer)
方法,除了字节读取从给定的文件位置。如果给定的文件位置大于读取时的文件大小,则没有读取字节数。
dst
-缓冲区中的字节都被转移
position
转移开始文件位置;必须是非负数
Future
对象
IllegalArgumentException
-如果位置是负面或缓冲区是只读的
NonReadableChannelException
-如果这通道不打开阅读
public abstract <A> void write(ByteBuffer src, long position, A attachment, CompletionHandler<Integer,? super A> handler)
这种方法以同样的方式为AsynchronousByteChannel.write(ByteBuffer,Object,CompletionHandler)
方法,除了字节写在指定的文件位置。如果给定的位置大于文件的大小,在写尝试的时候,那么该文件将被增长以适应新的字节;任何字节的值之间的前一个文件和新写的字节是未指定的。
A
-附件的类型
src
-缓冲器字节被转移
position
转移开始文件位置;必须是非负数
attachment
-连接到I/O操作的对象;可以
null
handler
-消费结果的处理程序
IllegalArgumentException
-如果位置是负的
NonWritableChannelException
-如果这个渠道没有打开写作
public abstract Future<Integer> write(ByteBuffer src, long position)
此方法从给定的缓冲区启动该通道的一个字节序列的写入,从给定的文件位置开始。该方法返回一个Future
代表等待结果的写操作。的Future
的get
方法返回写入的字节数。
这种方法以同样的方式为AsynchronousByteChannel.write(ByteBuffer)
方法,除了字节写在指定的文件位置。如果给定的位置大于文件的大小,在写尝试的时候,那么该文件将被增长以适应新的字节;任何字节的值之间的前一个文件和新写的字节是未指定的。
src
-缓冲器字节被转移
position
转移开始文件位置;必须是非负数
Future
对象
IllegalArgumentException
-如果位置是负的
NonWritableChannelException
-如果这个渠道没有打开写作
Submit a bug or feature
For further API reference and developer documentation, see Java SE Documentation. That documentation contains more detailed, developer-targeted descriptions, with conceptual overviews, definitions of terms, workarounds, and working code examples.
Copyright © 1993, 2014, Oracle and/or its affiliates. All rights reserved.