在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 socket 字节读取_Java SocketChannel 读取ByteBuffer字节的处理模型相关推荐

  1. java 读文件 二进制_JAVA中读取文件(二进制,字符)内容的几种方法总结

    JAVA中读取文件内容的方法有很多,比如按字节读取文件内容,按字符读取文件内容,按行读取文件内容,随机读取文件内容等方法,本文就以上方法的具体实现给出代码,需要的可以直接复制使用 public cla ...

  2. java 快速读文件_java快速读取文件

    如何优雅读取文件,java想简单读写一个文件都要上10行代码.幸好guava和apache commons 都有提供简单操作文件工具. 简单介绍读取文件最后一行.读取文件第一行.读取大文件.往大文件追 ...

  3. java properties文件 安全_java 数据库读取工具类(读取config.properties配置文件)[包含线程安全] | 学步园...

    java 数据库读取工具类(读取config.properties配置文件)[包含线程安全] 数据库读取工具类 package com.db; import java.sql.Connection; ...

  4. java socket编程客户端_Java Socket编程 - 基于Socket实现HTTP下载客户端

    没有借助任何第三方库,完全基于JAVA Socket实现一个最小化的HTTP文件下载客 户端.完整的演示如何通过Socket实现下载文件的HTTP请求(request header)发送 如何从Soc ...

  5. java socket远空_JAVA Socket超时浅析

    套接字或插座(socket)是一种软件形式的抽象,用于表达两台机器间一个连接的"终端".针对一个特定的连接,每台机器上都有一个"套接字",可以想象它们之间有一条 ...

  6. java socket 报文解析_java socket解析和发送二进制报文工具(附java和C++转化问题)

    解析: 首先是读取字节: /*** 读取输入流中指定字节的长度 * * 输入流 * *@paramlength 指定长度 *@return指定长度的字节数组*/ public static byte[ ...

  7. java socket 聊天室_java利用Socket实现聊天室功能实例

    导读热词 最近研究了下Java socket通信基础,利用代码实现了一个简单的多人聊天室功能,现把代码共享下,希望能帮到有兴趣了解的人. 目录结构: ChatClient: package com.p ...

  8. java字节字符_java中字符和字节的区别

    byte(字节): byte即字节的意思,是java中的基本数据类型,用来申明字节型的变量,一个字节包含8个位,所以,byte类型的取值范围是-128到127. 通常在读取非文本文件时(如图片,声音, ...

  9. java socket 连接邮箱_Java与邮件系统交互之使用Socket验证邮箱是否存在

    最近遇到一个需求:需要验证用户填写的邮箱地址是否真实存在,是否可达.和普通的正则表达式不同,他要求尝试链接目标邮箱服务器并请求校验目标邮箱是否存在. 先来了解 DNS之MX记录 对于DNS不了解的,请 ...

最新文章

  1. Oracle CDC配置案例
  2. 微软转型里程碑:云计算收入首次超过Windows业务
  3. ora-01033:oracle initializationgorshutdown 处理方法
  4. jquery easyui datagrid 排序列
  5. 开启多媒体台式计算机过程,计算机硬件的组成多媒体教学课件制作
  6. POJ - 2083 Fractal(dfs,递归画图)
  7. 这也许是你不曾留意过的 Mybatis 细节
  8. LeetCode 987. 二叉树的垂序遍历(递归/循环)
  9. NGUI字体贴图压缩以及相关Shader解读
  10. Android Studio增加assets目录、raw目录
  11. SGU 210 Acdream 1227 Beloved Sons KM
  12. .NET中过滤TextBox中输入的html标签
  13. lg手机历史机型_lg手机大全【详细介绍】
  14. Visio使用经验汇集
  15. DevOps前沿技术培训课程大纲
  16. 另辟蹊径,独树一帜的写作方法
  17. 如何带团队,怎么带团队。
  18. 计算机的模拟电路基础
  19. MFC 加入文件时有坑stdafx.h
  20. 网页游戏HTML5--爱心鱼实现过程

热门文章

  1. 最近项目重构的一些感想
  2. 死磕Java并发:Java内存模型之分析volatile
  3. matlab fft例程,c++ FFTW与Matlab FFT
  4. reg 只能导入二进制注册文件
  5. torch EOFError: Ran out of input
  6. Application provided invalid, non monotonically increasing dts to muxer in stream 0: -92233720368547
  7. spring中ClassPathXmlApplication和FileSystemXmlApplicationContext使用区别
  8. matlab 图像操作函数的详解
  9. gcc中extra qualification错误
  10. PMP-【第7章 项目成本管理】-2021-2-12(161页-179页)