ICode9

精准搜索请尝试: 精确搜索
首页 > 编程语言> 文章详细

Java NIO

2022-05-11 19:35:05  阅读:181  来源: 互联网

标签:文件 Java NIO buffer 缓冲区 字节 size 通道


字节缓冲区

字节顺序-大端-小端

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

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有