NIO Buffer

本文详细介绍了Java NIO中Buffer的基本用法,包括如何通过Channel读写数据,并解释了Buffer中的position、limit和capacity三个关键概念及其在读写模式下的变化规律。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

1.Buffer的基本用法
  Buffer是和Channel一块使用的,首先来看一段代码:

public class Buffer {

        public static void main(String[] args) throws IOException {
            //获取文件流
            RandomAccessFile inFile = new RandomAccessFile("C:\\test\\input.txt", "rw");
            RandomAccessFile outFile = new RandomAccessFile("C:\\test\\output.txt", "rw");

            //获取通道
            FileChannel in = inFile.getChannel(),
                        out = outFile.getChannel();

            //分配Buffer大小为48字节
            ByteBuffer buf = ByteBuffer.allocate(48);

            while(in.read(buf) != -1){

                //调用flip()为把Buffer的数据写到Channel做准备
                buf.flip();
                //将Buffer的数据写到Channel中
                out.write(buf);
                //清空Buffer为下一次从Channel读取数据到Buffer做准备
                buf.clear();
            }

            inFile.close();
            outFile.close();
        }
    }
增加格式化后输出如下:
Before read() : 
 position:0,limit:48,capacity:48
After read() : 
 position:17,limit:48,capacity:48 

Before flip() : 
 position:17,limit:48,capacity:48
After flip() : 
 position:0,limit:17,capacity:48 

Before write() : 
 position:0,limit:17,capacity:48
After write() : 
 position:17,limit:17,capacity:48 

Before clear() : 
 position:17,limit:17,capacity:48
After clear() : 
 position:0,limit:48,capacity:48 

2. position,limit,capacity
  Buffer有三个重要的参数:position,limit,capacity,要解释上面的结果先了解这三个参数在Buffer的读模式和写模式时发生了什么变化。下面是示意图(搬运工):
 
   这里写图片描述

  在Bufer的写模式中(调用的是Channel的读方法:in.read(buf);读和写是相对的,此时对Buffer来说因为数据是写入的,所以是写模式),position最初指向最开始的位置,limit和capacity指向最末的位置(写模式中limit和capacity值是一样的),
随着数据的不断写入,limit和capacity位置不变,而position位置不断后移,直到达到limit的位置。
  在Buffer的读模式中(调用的是Channel的读方法:out.write(buf);),position最初指向最开始的位置,limit指向写入Buffer数据量大小的位置,capacity指向最末位置。随着数据的不断读取,limit和capacity位置不变,而position位置不断后移,直到达到limit的位置。

3.flip()和clear()做了什么?
  flip()方法就是将Buffer置于读模式,而clear()方法就是将Buffer置于写模式的最初状态。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值