Java NIO学习总结二(Buffer缓冲区)

上一篇我们讲了NIO的非阻塞特性,NIO的第二个特性就是面向缓冲区,相对于传统IO的面向流特点,面向缓冲区可以更灵活方便地处理输入输出,缓冲区实质上是处理数据的一种规范化工具,可以满足我们的各种要求,比如下例中要求用户输入达到10个字节时就将输入打印出来:

public class BufferTest {
    public static void main(String[] args) {
        try {
            ServerSocketChannel ssc = ServerSocketChannel.open();
            ssc.bind(new InetSocketAddress(8189));
            ssc.configureBlocking(false); // 设定为非阻塞

            Map
  
  
   
    sbMap = new HashMap<>();

            while (true) {
                SocketChannel sc = ssc.accept(); // 此处不再阻塞

                if (sc != null) {
                    sbMap.put(sc, ByteBuffer.allocate(10));
                    System.out.println("new socket");

                    sc.configureBlocking(false); // 设定为非阻塞
                }

                for (Map.Entry
   
   
    
     sbTemp : sbMap.entrySet()) {
                    SocketChannel scTemp = sbTemp.getKey();
                    ByteBuffer bbTemp = sbTemp.getValue();

                    if (scTemp.read(bbTemp) == -1) { // 此处不再阻塞
                        sbMap.remove(scTemp); // 连接断开后清除该SocketChannel
                        continue;
                    }

                    if (bbTemp.position() == bbTemp.capacity()) {
                        bbTemp.flip();

                        while (bbTemp.hasRemaining()) {
                            System.out.print((char) bbTemp.get());
                        }

                        bbTemp.clear();
                    }
                }
            }
        } catch (IOException e) {
            e.printStackTrace();
        }
    }
}
   
   
  
  

解释下Buffer类的几个属性:

postion:读写开始的位置;

limit:读写的最大位置;

capacity:缓冲区的容量。

比如本例中缓冲区capacity为10,起始时postion为0,limit为10,用户每输入一个,position向后移一位,假设用户输入4个字节,这时postion变为4,limit仍为10,那么当从缓冲区读时,position应该为0,limit应该变成5,flip函数的功能就是完成这个转换。

本例是由上一篇中的例子改进而来,每个连接channel对应一个缓冲区,缓冲区的大小设定为10个字节,在写模式下,当缓冲区的position和capacity相等时,即缓冲区已满,缓冲区切换到读模式,将缓冲区内容输出到控制台。read()函数结果为-1时,表示连接已断开,这时应移除该SocketChannel。

总的来说,缓冲区可以帮助我们方便得处理各种渠道的输入输出,是传统IO基础上的一个很好的补充。

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值