NIO学习笔记四

缓冲区的分配和包装

    第一行使用ByteBuffer的静态方法allocate()来分配缓冲区,函数参数指定了缓冲区的大小。第三行是将现有的数组转成缓冲区,通过静态方法wrap(),参数为现有的数组。

ByteBuffer buffer = ByteBuffer.allocate(1024);
byte array[] = new byte[1024];
ByteBuffer buffer = ByteBuffer.wrap(array);

缓冲区分片

    slice()方法根据现有的缓冲区创建一个字缓冲区,创建的子缓冲区共享原来缓冲区的空间。

    第一行创建一个长度为10的缓冲区,第二行第三行通过position和limit来指定子缓冲区窗口的起始位置和结束位置,第四行调用slice()方法来创建子缓冲区。注意,在子缓冲区中对数据进行修改,会作用于原来的缓冲区上,因为它们共享一个底层数组。比如,我对子缓冲区中的数据多做加10操作,然后遍历输出原来缓冲区的内容,会看到分配给子缓冲区的那些元素上的数据,都加上了10,而其他的保持不变。

ByteBuffer buffer = ByteBuffer.allocate(10);
buffer.position(3);
buffer.limit(7);
ByteBuffer slice = buffer.slice();

只读缓冲区

    通过调用缓冲区的 asReadOnlyBuffer() 方法,将任何常规缓冲区转换为只读缓冲区,这个方法返回一个与原缓冲区完全相同的缓冲区(并与其共享数据),只不过它是只读的。不能将只读的缓冲区转换为可写的缓冲区。

ByteBuffer buffer = ByteBuffer.allocate(64);
ByteBuffer readOnlyBuffer = buffer.asReadOnlyBuffer();

直接缓冲区

    直接缓冲区是为了加快I/O速度,而以一种特殊的方法分配其内存的缓冲区。可使用ByteBuffer的静态函数allocateDirect()来生成直接缓冲区。

ByteBuffer buffer = ByteBuffer.allocateDirect(1024);

内存映射文件I/O

    利用操作系统底层提供的访问机制,将文件的部分映射为内存的部分。尽管创建内存映射文件相当简单,但是向它写入可能是危险的。仅只是改变数组的单个元素这样的简单操作,就可能会直接修改磁盘上的文件。修改数据与将数据保存到磁盘是没有分开的。可以使用FileChannel.map()来创建内存映射。其中map的第一个参数有三种可选类型,都是静态的成员变量,第一种是PRIVATE,表示专用(写入时拷贝)映射模式,可读可写,但是修改的内容不会写入文件,只是buffer自身的改变;第二种是READ_ONLY,表示只读映射,只能对buffer进行读取操作,否则会抛出ReadOnlyBufferException异常;第三种是READ_WRITE,表示读取/写入映射模式,对buffer的修改会写入文件。

FileOutputStream out = new FileOutputStream("d:\\test.txt");
FileChannel channel = out.getChannel();
MappedByteBuffer mapBuffer = channel.map(FileChannel.MapMode.READ_WRITE, 0, 1024);

分散和聚集I/O

    分散和聚集 I/O 是使用多个而不是单个缓冲区来保存数据的读写方法。一个分散的读取是将数据读取到一个缓冲区数组中,而不是读到单个缓冲区。一个聚集写入时把数据写入缓冲区数组,而不是单个缓冲区。在分散读取中,通道一次填充每个缓冲区,填满一个缓冲区后,它就开始填充下一个。在聚集写入中,会把数据依次写入到缓冲区中。

long read(ByteBuffer[] dsts);
long read(ByteBuffer[] dsts, int offset, int length);
long write(ByteBuffer[] srcs);
long write(ByteBuffer[] srcs, int offset, int length);


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值