Java NIO
作者:互联网
字节缓冲区
字节顺序-大端-小端
ByteOrder.nativeOrder().toString() 获取当前处理器的字节顺序
直接缓冲区
ByteBuffer.allocateDirect() 创建所需容量的直接缓冲区
isDirect() 是否直接缓冲区
只有字节类型数据才可以创建直接缓冲区,其他类型可使用视图缓冲区
ByteBuffer.asCharBuffer() 根据字节直接缓冲区创建一个字符直接缓冲区
视图缓冲区
与源缓冲区操作地址一致,但position\limit 等标识可不一致。
byteBuffer.as***() 此类操作以字节顺序包装为指定缓冲区
duplicate()
slice()
通道
通道是途径,是抽象的概念,受控的且可移值的方式来访问操作系统底层I/O
- 文件通道
- Socket通道
阻塞、非阻塞
打开通道
FileChannel.getChannle()
SocketSchannel.getChannel()
关闭通道
通道是无法重复使用的
中断阻塞在通道上的线程会自动关闭通道
channel.close(); 在网络上可能是阻塞的(在内容被提取前,部分框架可能会阻塞通道关闭)
Scatter/Gather(发散/收集)
以Channel为视角,channel.writer(Buffer[] ) 。channel.read(Buffer[])
通道接收多个缓冲区,将多个缓冲区内容“Gather”到通道。
将通道内容“Scatter”到多个缓冲区。
这个过程是顺序的。也是高效的(由操作系统直接完成)。
buffer--\ channel / buffer
buffer----Scatter ======= Gather------buffer
buffer--/ \ buffer
文件通道
FileChannel
read()/write()方法会改变Position位置,同一文件的多个对象是共享Position的(由操作系统控制)。
read(p)/write(p) 这个是不共享的。
将position位置移动到大于文件size的位置,调用write()可能会照成 "文件空洞"。
truncate() 会去除超出的size值,并将position = size
force(boolean) 类似刷盘的操作,强制将文件内容写入磁盘。参数标识是否将文件元数据强制写入。
文件锁
不支持共享锁的操作系统自动升级到独享锁。
锁的对象是文件,而不是通道或者缓冲区。
锁判断的是进程而不是线程,意味着同一Java进程获取到锁后同一进程都能获取到锁。
FileChannel.lock(position,size, shared) 锁定position-size位置,shared标识是否共享。
channel关闭、FileLock.release()、进程关闭会释放锁。
FileLock.isVaild() 校验锁是否有效。
避免死锁。
内存映射文件
MapperByteBuffer 将物理磁盘中的文件直接在程序中操作。
load()
isLoaded()
force() 与FileChannel.force()一样
transferto/transferForm 通道间文件数据传输,有一端必须为FileChannel。传输当前通道已有数据到另一通道。不经过用户空间。
Socket通道
标签:文件,Java,NIO,buffer,缓冲区,字节,size,通道 来源: https://www.cnblogs.com/ccame/p/16254778.html