Java NIO

2022/5/11 20:13:31

本文主要是介绍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的文章就介绍到这儿,希望我们推荐的文章对大家有所帮助,也希望大家多多支持为之网!


扫一扫关注最新编程教程