package rtc.core.net;
import java.util.Arrays;
public class RingBuffer {
private byte[] array;
private int readPos;//读的起始位置
private int writePos;//写的起始位置
public RingBuffer(int capacity){
array = new byte[capacity];
}
public void clear(){
readPos = writePos = 0;
}
public int remaining(){
if(readPos <= writePos){
return array.length - (writePos - readPos);
}else{
return readPos - writePos;
}
}
public int readable(){
return array.length - remaining();
}
private int reCapacity(int need){
if(need <= array.length){
return array.length;
}
int newCap = array.length;
while (newCap < need){
newCap *= 2;
}
byte[] temp = new byte[newCap];
if(readPos == writePos){
readPos = 0;
writePos = 0;
array = temp;
}else if(readPos < writePos){
int length = readable();
System.arraycopy(array,readPos,temp,0,length);
readPos = 0;
writePos = readPos + length;
array = temp;
}else{
int length = array.length - readPos;
System.arraycopy(array,readPos,temp,0,length);
System.arraycopy(array,0,temp,length,writePos);
writePos = length + writePos;
readPos = 0;
array = temp;
}
return array.length;
}
public int write(byte[] data){
return write(data,0,data.length);
}
public int write(byte[] data,int offset,int length){
if(data == null || data.length == 0 || length == 0) return 0;
if(offset < 0 || length < 0 || (offset + length > data.length)){
throw new IllegalArgumentException(String.format("params error , offset = %s,length = %s,data.length = %s",offset,length,data.length));
}
int remaining = remaining();
if(length > remaining){
reCapacity(array.length + (length - remaining));
}
if(readPos <= writePos){
int wrote = Math.min(array.length - writePos,length);
System.arraycopy(data,offset,array,writePos,wrote);
writePos += wrote;
if(length > wrote){
System.arraycopy(data,offset + wrote,array,0,length - wrote);
writePos = (length - wrote);
}
}else{
System.arraycopy(data,offset,array,writePos,length);
writePos += length;
}
return length;
}
public int peek(byte[] buff){
return peek(buff,0,buff.length);
}
public int peek(byte[] buff,int offset,int length){
return read(buff,offset,length,true);
}
public int read(byte[] buff){
return read(buff,0,buff.length,false);
}
public int read(byte[] buff,int offset,int length,boolean peek){
if(buff == null || buff.length == 0 || length == 0) return 0;
if(offset < 0 || length < 0 || offset >= buff.length){
throw new IllegalArgumentException(String.format("params error , offset = %s,length = %s,buff.length = %s",offset,length,buff.length));
}
length = Math.min(readable(),length);
length = Math.min(buff.length - offset,length);
if(length > 0){
if(readPos <= writePos){
System.arraycopy(array,readPos,buff,offset,length);
if(!peek){
readPos += length;
}
}else{
int read = Math.min(array.length - readPos,length);
System.arraycopy(array,readPos,buff,offset,read);
if(!peek){
readPos += read;
}
if(read < length){
System.arraycopy(array,0,buff,offset + read,length - read);
if(!peek){
readPos = (length - read);
}
}
}
}
return length;
}
public String dump(){
String msg = "array.length = "+array.length + ",";
msg += ("readPos = "+readPos+",");
msg += ("writePos = "+writePos+",");
msg += ("readable = "+readable()+",");
msg += ("remaining = "+remaining());
return msg;
}
public static void main(String[] args){
final RingBuffer buffer = new RingBuffer(8);
final byte[] data = new byte[]{'0','1','2','3','4','5','6','7','8','9'};
buffer.write(data);
System.out.println("write data : "+Arrays.toString(data));
System.out.println("dump : "+buffer.dump());
for(int i = 0 ; i < 100 ; i++){
int readable = buffer.readable();
System.out.println("i = "+ i +",readable = "+buffer.readable());
if(i % 3 == 0){
byte[] readBuff = new byte[readable];
buffer.read(readBuff);
System.out.println("i = " + i+",readBuff = "+ Arrays.toString(readBuff));
System.out.println("dump : "+buffer.dump());
}else{
byte[] temp = data.clone();
if(i % 2 == 0){
temp = data.clone().clone();
}
System.out.println("i = " + i+",write data : "+Arrays.toString(temp));
buffer.write(temp);
System.out.println("dump : "+buffer.dump());
}
}
}
}
环形数组CircleBuffer.zip


环形数组,也被称为循环数组,是一种特殊的数据结构,它在计算机科学中有着广泛的应用,尤其是在数据缓存、队列实现、以及实时系统等领域。环形数组的基本思想是将一个一维数组视为一个首尾相接的环,使得最后一个元素之后是第一个元素,形成了一个连续的循环空间。 在C语言中实现环形数组,我们需要考虑如何有效地进行插入和删除操作,同时保持数组的循环特性。关键在于管理数组的“头”和“尾”指针,它们代表了当前可插入和可删除的位置。当我们向环形数组中添加元素时,如果尾指针追赶上头指针,这就意味着数组已满,需要进行特殊处理,例如重置头指针或者扩大数组容量。同样,删除元素时,若头指针追赶上尾指针,表示数组为空。 Java语言实现环形数组则更为方便,因为Java提供了更强大的数据结构支持。我们可以利用ArrayList或LinkedList等内置类,通过巧妙地管理索引来实现环形数组。例如,我们可以创建一个ArrayList,然后通过两个索引变量,一个表示头,一个表示尾,来跟踪数组的状态。在Java中,我们还可以利用并发工具类如`ArrayBlockingQueue`,它是一个线程安全的环形缓冲区,适合多线程环境下的数据共享。 在环形数组的实现中,需要注意以下几点: 1. **初始化**:创建数组或列表,并设置头尾指针(或索引)为0。 2. **插入操作**:当插入元素时,更新尾指针,若尾指针等于数组长度减一(即已满),需要判断是否需要扩容或者重新设置头指针为0。 3. **删除操作**:当删除元素时,更新头指针,若头指针等于尾指针,表示数组为空,需要特别处理。 4. **遍历操作**:由于环形数组的特殊性,遍历不能简单地从头到尾,而是要根据头尾关系进行适当处理。 5. **线程安全**:在多线程环境下,插入和删除操作需要同步控制,避免数据竞争。 在"【环形数组】CircleBuffer"这个文件中,可能包含了C和Java两种语言实现环形数组的代码示例,可以作为学习和参考。通过阅读和理解这些代码,你可以更深入地了解环形数组的内部机制和实现细节,从而在实际项目中灵活运用。同时,这也是一个很好的练习,可以帮助你提高对数据结构和算法的理解,尤其是对于处理有限空间的数据存储问题。




























- 1

- #完美解决问题
- #运行顺畅
- #内容详尽
- #全网独家
- #注释完整

- 粉丝: 5277
- 资源: 519
我的内容管理 展开
我的资源 快来上传第一个资源
我的收益
登录查看自己的收益我的积分 登录查看自己的积分
我的C币 登录后查看C币余额
我的收藏
我的下载
下载帮助


最新资源
- ,,西门子SMART200程序 PID的控制写法,突破8路,PID直接做成子程序,无密码,直接调用 ,西门子SMART200程序; PID控制写法; 突破8路; PID子程序; 无密码调用; 控制
- 企业数据治理方案:数据仓库统一数据分析系统建设方案.ppt
- 数字化it平台架构与应用蓝图建设方案 (1).ppt
- 数字化it平台架构与应用蓝图建设方案.ppt
- 智能工厂生产制造执行系统(MES)建设方案.ppt
- YOLOv12测试训练集
- 自考03709马克思主义
- ,,Modbus RTU 51单片机从机工程源码与昆仑通泰触摸屏测试工程文件 支持485和232串口通信,该从机源码支持51系列和STC12系列单片机,支持功能码01,02,03,04,05,06
- 2001-2023年上市公司数字化转型词频统计数据(年报词频统计、MD&A报告词频统计衡量两种方式)(吴非、赵宸宇、甄红线300+关键词三种方法).rar
- ,,C#联合halcon开发的通用视觉框架,可供初学者使用,是一C#联合halcon开发的通用视觉框架,可供初学者使用,是一 个不错的学习框架,发的是源码,发完不 ,发的是源码源码 ,C#联合Halc
- 基于人工智能的投资系统概念验证项目 项目目标是探索如何使用 AI 来辅助投资决策 本项目仅用于教育目的,不适用于实际交易或投资
- ,,基于DELM深度极限学习机的回归预测MATLAB代码 代码注释清楚 main为主程序,可以读取EXCEL数据,使用自己数据集 很方便,初学者容易上手 ,核心关键词:DELM深度极限学习
- 全国POI兴趣点数据2024年
- ,,Matlab学习卡尔曼滤波以及状态观测器的各种实例代码和模型 讲解,各种卡尔曼滤波的m代码,可以一行一行讲(KF,EKF,UKF,SRUKF,CKF,SRCKF等) KF,EKF,UKF,SRUK
- 一彩进销存管理软件2025正式版/功能不限制/可长期用
- ,,欧姆龙程序,Sysmac Studio伺服程序打包块,直接调用,并实现以下功能: 硬件:NJ101-1000 R88D-KN01H系列伺服 输入信号如下: 1:使能输入和故障复位 2:点动正


