NIO笔记

一、一个Buffer对象是固定数量的数据的容器。
1. 固定数量
2. 容器
二、缓冲区的工作与通道紧密联系
IO通道

三、属性
容量(Capacity):类似数组的容量
缓冲区能够容纳的数据元素的最大数量。这一容量在缓冲区创建时被设定,并且永远不能被改变。
上界(Limit):类似数组中存储的最后一个元素的下标
缓冲区的第一个不能被读或写的元素。或者说,缓冲区中现存元素的计数。
位置(Position):类似数组中当前位置的指针
下一个要被读或写的元素的索引。位置会自动由相应的 get( )和 put( )函数更新。
标记(Mark):存储上一次 position的位置
一个备忘位置。调用 mark( )来设定 mark = postion。调用 reset( )设定 position =
mark。标记在设定前是未定义的( undefined) 

四、常用方法
put/get ,存取数据
flip ,数据储存结束,开始读取
mark ,标记当前位置
hasRemaining ,是否还有数据没有读取
compact ,压缩
clear ,清除数据

五、创建缓冲区
分配操作创建: 分配操作创建一个缓冲区对象并分配一个私有的空间来储存容量大小的数据元素
public static CharBuffer allocate (int capacity)
包装操作创建:
包装操作创建一个缓冲区对象但是不分配任何空间来储存数据元素。它使用您所提供的数组作为存储空间来储存缓冲区中的数据元素。
public static CharBuffer wrap (char [] array)
public static CharBuffer wrap (char [] array, int offset,int length)
例:
char[] chars = new char[]{'a','b','c'};
CharBuffer wrap = CharBuffer.wrap(chars);
chars 和 wrap 对象都指向 堆中的 数组空间

六、视图缓冲器
可以创建描述从外部存储到数组中的数据元素的缓冲区对象。
释义:
可以 创建 一个 缓冲区 对象, 该缓冲区对象 描述的 数据元素 是 从 外部存储到数组中的。

但是缓冲区不限于管理数组中的外部数据。它们也能管理 其他缓冲区 中的外部数据。当一个管
理其他缓冲器所包含的数据元素的缓冲器被创建时,这个缓冲器被称为视图缓冲器
释义:
创建了 一个 缓冲区对象, 该缓冲区对象 是 管理 其他 缓冲区对象 所管理的 数据。

视图存储器总是通过调用已存在的存储器实例中的函数来创建
public abstract CharBuffer duplicate( );
public abstract CharBuffer asReadOnlyBuffer( );
public abstract CharBuffer slice( ) 
slice()创建一个从原始缓冲区的当前位置开始的新缓冲
区,并且其容量是原始缓冲区的剩余元素数量(limit-position)

七、字节缓冲区专题
1. 直接缓冲区
ByteBuffer.allocateDirect()

2. 视图缓冲区
ByteBuffer 类允许创建视图来将 byte 型缓冲区字节数据映射为其它的原始数据类型
public abstract CharBuffer asCharBuffer( );
public abstract ShortBuffer asShortBuffer( );
public abstract IntBuffer asIntBuffer( );
public abstract LongBuffer asLongBuffer( );
public abstract FloatBuffer asFloatBuffer( );
public abstract DoubleBuffer asDoubleBuffer( );


八、通道
Channel 用于在字节缓冲区和位于通道另一侧的实体(通常是一个文件或套接字)之间有效地传输数据。

数据 (信息)、缓冲区(载体) 、通道

填充缓冲区: 将数据信息 写入 缓冲区中

通道传输: 将 缓冲区的数据 传递到 另一侧的 I/O 服务

通道与操作系统的文件描述符(File Descriptor)和文件句柄(File Handle)有着一对一的关系

通道是一种途径,借助该途径,可以用最小的总开销来访问操作系统本身的 I/O 服务。缓冲区则是通道内部用来发送和接收数据的端点


ByteBuffer[JVM]  ---- FileSystem[OS]
ByteBuffer[JVM]  ---- Network[OS]

Channel
WritableByteChannel
ReadableByteChannel

InterruptibleChannel
AbstractInterruptibleChannel
AbstractSelectableChannel

File IO -- 文件(file)通道 ,FileChannel
Stream IO -- 套接字(socket)通道,SocketChannel、ServerSocketChannel 和 DatagramChannel

打开通道:
SocketChannel sc = SocketChannel.open( );
sc.connect (new InetSocketAddress ("somehost", someport));

ServerSocketChannel ssc = ServerSocketChannel.open( );
ssc.socket( ).bind (new InetSocketAddress (somelocalport));

DatagramChannel dc = DatagramChannel.open( );

RandomAccessFile raf = new RandomAccessFile ("somefile", "r");
FileChannel fc = raf.getChannel( );

使用通道:
socket 通道: 双向
file 通道: 双向,但是要看是否有权限操作

ByteChannel 接口,该接口引申出了 ReadableByteChannel 和WritableByteChannel 两个接口。
ByteChannel 接口本身并不定义新的 API 方法,它是一种用来聚集它自己以一个新名称继承的多个接口的便捷接口

使用字节缓存区
ByteBuffer buffer = ByteBuffer.allocateDirect (16 * 1024);

文件通道:
文件通道总是阻塞式的,因此不能被置于非阻塞模式

FileChannel对象不能直接创建
一个FileChannel实例只能通过在一个打开的file对象(RandomAccessFile、FileInputStream或 FileOutputStream)上调用getChannel( )方法获取

FileChannel 对象是线程安全(thread-safe)的


 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值