在JAVA中的流分为字节流或字符流,一般来说采用字符流处理起来更加方便。字节流处理起来相对麻烦,SocketChannel中将数据读取到ByteBuffer中,如何取出完整的一行数据(使用CRLF分隔)?

例如:

Socket收到的内容为:

1234567890CRLF

0123456789CRLF

注意:CRLF为回车换行符号

如果使用 SocketChannel.read(ByteBuffer buff)读取数据,如果buff的capatity为12, 则第一次读取的数据为 “1234567890CRLF” 刚好为一行,但是如果buff的capatity小于12,则要读取两次以上才能读到CRLF回车换行符号。如果buff.capatity大于12,则会读取到第二行的数据,那么下次读取操作时,如何处理第一次多读到的数据?  这个问题与 "回推流" 类似。

为解决此问题,并实现与“回推流”类似的功能。建立如下的处理模型

Source、Cursor接口实现从Channel中读取字节,并实现回推功能。

Source.ready() 函数返回已经从Channel中读取的数据。如果Buffer中还有数据,则返回Buffer中剩余的自己数,如果Buffer中的字节都已经读取了,则重新从Channel中读取数据到Buffer中。如果没有数据可以读取了,则返回-1;

Source.ready(byte[] dst, int off, int len) 函数重Buffer中读取数据到 dst中。

Source.reset(int len) 函数在Buffer层面上实现回退,即设置Buffer.position。

Cursor接口对Source接口进一步封装,同时提供push函数扩展了reset的回推功能。

Cursor.push(byte[] src, int off, int len) 将byte[]中的数据回推到Cursor中,下次读取操作时将把push进去的数据读取出来。

Consumer接口使用consumer函数从Cursor中读取数据,并进行相应的处理。根据不同的业务逻辑继承Consumer接口处理Cursor中的数据。

Java SocketChannel 读取ByteBuffer字节的处理模型的更多相关文章

  1. 图解java中的bytebuffer

    因何而写 网上关于bytebuffer的文章真的很多,为何在此还要写一篇呢?主要是基于以下几点考虑 很多人在使用t-io时,还不会bytebuffer,只会照着t-io提供的例子照猫画虎,不利于灵活运 ...

  2. 读取ByteBuffer有效的数据

    转:https://zhidao.baidu.com/question/427134449349230532.html说道 ByteBuffer的缓冲区,就需要知道缓冲区的的三个状态1)capacit ...

  3. Java 运行时数据区和内存模型

    运行时数据区是指对 JVM 运行过程中涉及到的内存根据功能.目的进行的划分,而内存模型可以理解为对内存进行存取操作的过程定义.总是有人望文生义的将前者描述为 "Java 内存模型" ...

  4. Java将文件转为字节数组

    Java将文件转为字节数组 关键字:文件,文件流,字节流,字节数组,二进制 摘要:最近工作中碰到的需求是,利用http传输二进制数据到服务器对应接口,需要传输userId, file(加密后)等一系列 ...

  5. java中读取文件以及向文件中追加数据的总结

    package gys; import java.io.BufferedReader; import java.io.File; import java.io.FileInputStream; imp ...

  6. Java InputStream读取网络响应Response数据的方法

    Java InputStream读取数据问题 原理讲解 1. 关于InputStream.read()     在从数据流里读取数据时,为图简单,经常用InputStream.read()方法.这个方 ...

  7. 分享非常有用的Java程序(关键代码)(八)---Java InputStream读取网络响应Response数据的方法!(重要)

    原文:分享非常有用的Java程序(关键代码)(八)---Java InputStream读取网络响应Response数据的方法!(重要) Java InputStream读取数据问题 ======== ...

  8. Java IO 转换流 字节转字符流

    Java IO 转换流 字节转字符流 @author ixenos 字节流 输入字节流:---------| InputStream 所有输入字节流的基类. 抽象类.------------| Fil ...

  9. 【转载】java InputStream读取数据问题

    原文链接:http://www.cnblogs.com/MyFavorite/archive/2010/10/19/1855758.html 1. 关于InputStream.read()     在 ...

随机推荐

  1. git分支小问题

    参考网址:http://hbiao68.iteye.com/blog/2055493 1.查看分支 git branch 或者 git branch -v 2.创建一个新的分支 git branch ...

  2. struts配置json需要的jar包

  3. [one day one question] Vue数组变更不能触发刷新

    问题描述:Vue数组变更不能触发刷新,特别是数组的每个元素都是对象的时候,对象中某个属性的值发生变化,根本无法触发Vue的dom刷新,这怎么破? 解决方案:this.$set(array, index ...

  4. python3 第三章 - 程序的基本结构

    1.编码 默认情况下,Python 3 源码文件以 UTF-8 编码,所有字符串都是 unicode 字符串. 当然你也可以为源码文件指定不同的编码: # -*- coding: cp-1252 -* ...

  5. float是什么样式?

    什么是float样式? 让标签浮动起来,总体方向往上 right,left(右浮,左浮) 联合height,width使用,分别占用y方向和x方向多少,单位px或百分比(%) 作用对象不是页面,而是作 ...

  6. JS实现倒计时

    HTML部分: <div class="div"> <div id="div"> </div> </div> C ...

  7. junit源码解析--捕获测试结果

    OK,前面的博客我们整理了junit运行完了所有的测试用例,那么OK了,现在开始该收集测试结果了. 在这最后一步中,junit主要是玩一个类,TestResult.这里类中封装了几个参数,在初始化这个 ...

  8. Servlet--取得session,application内置对象

    在前面的博客里面,使用Servlet取得了request,response,config对象,实际上通过Servlet程序也可以取得session,application等内置对象. 1,通过Http ...

  9. docker搭建私服

    拉registry镜像 假设在192.168.100.17服务器上搭建私服 docker pull registry docker run -d -v /data/docker/registry:/v ...

  10. web技术发展历程--读《大型网站技术架构_核心原理与案例分析》

    1 早期的web服务 2 CGI程序的出现.发展.凋零到MVC的兴起 CGI:通用网关接口技术. 随着CGI技术的出现,web服务端可以通过不同的用户请求产生动态页面内容. web服务器将请求数据交给 ...