JAVA NIO BUFFER (三)

举报
张俭 发表于 2023/12/29 15:05:02 2023/12/29
667 0 0
【摘要】 我们准备好了Buffer,现在我们要将它交由Channel处理。现在假设我们填满了一个Buffer,emmmm,然后把它传给Channel对象,Channel对象对buffer调用get方法,然后position自加,会怎么样?IndexOutOfBoundsException被抛出了!那怎么办?为了让Channel能够处理对象,我们需要把postion重设为你希望它开始处理的位置,顺便再设...

我们准备好了Buffer,现在我们要将它交由Channel处理。现在假设我们填满了一个Buffer,emmmm,然后把它传给Channel对象,Channel对象对buffer调用get方法,然后position自加,会怎么样?IndexOutOfBoundsException被抛出了!

那怎么办?为了让Channel能够处理对象,我们需要把postion重设为你希望它开始处理的位置,顺便再设置limite为现在存储的位置,假设我们需要Channel从头开始处理对象,那么就应该做如下的处理:

  buffer.limit(buffer.position()).position(0);
  //上面的调用,等同于如下的方法
  buffer.flip();

然后概念图就会变成下面这样:
image.png

JAVA NIO BUFFER(一)中提到的rewind()方法,只把position设置为0,并不影响limit的位置。

进行完这个操作之后,你就可以试着读取里面的数据

  //利用hasRemaining()方法判断Buffer中是否还有数据
  for(int i=0;buffer.hasRemaining();i++) {
    myByteArray[I]=buffer.get();
  }
  //上面的方法未必高效,循环体中每次循环都要进行一次判断
  //你可以使用remaining()方法,返回剩余的数目
  int count = buffer.remaining();
  for(int i=0;buffer.count;i++) {
    myByteArray[I]=buffer.get();
  }
  //如果你对Buffer有着惊人的控制,那么不进行数据检查将会是最快的

一旦Buffer使用完毕,它就可以进行复用,clear()方法把一个Buffer重置到一个空的状态。它不更改任何数据,把limit设置为capacity,并把position设置为0.至于里面是不是还有数据?这不重要,Buffer仅仅通过position来判断数据的“死活”为什么一定要将数据置空,这些操作难道不需要时间吗?下面的例子使用到了一些buffer的基本操作:

public class BufferFillDrain {
    //原代码作者 Ron Hitchens (ron@ronsoft.com)
    private static int index = 0;

    private static String[] strings = {
            "Hello, this is ZhangJian",
            "He likes Eminem",
            "Put the dick in the dust",
            "And? Fuck the world?",
            "Lyrics are great",
            "But what I like more",
            "is the spirit"
    };

    public static void main(String[] args) throws Exception {
        CharBuffer buffer = CharBuffer.allocate(100);
        while( fillBuffer(buffer)) {
            buffer.flip();
            drainBuffer(buffer);
            buffer.clear();
        }
    }

    private static void drainBuffer (CharBuffer buffer) {
        while (buffer.hasRemaining()) {
            System.out.print(buffer.get());
        }

        System.out.println("");
    }

    private static boolean fillBuffer(CharBuffer buffer) {
        if(index >= strings.length) {
            return false;
        }
        String string = strings[index++];
        for(int i=0;i<string.length();i++) {
            buffer.put(string.charAt(i));
        }
        return true;
    }

}
【声明】本内容来自华为云开发者社区博主,不代表华为云及华为云开发者社区的观点和立场。转载时必须标注文章的来源(华为云社区)、文章链接、文章作者等基本信息,否则作者和本社区有权追究责任。如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

作者其他文章

评论(0

抱歉,系统识别当前为高风险访问,暂不支持该操作

    全部回复

    上滑加载中

    设置昵称

    在此一键设置昵称,即可参与社区互动!

    *长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

    *长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。