字节队列类
This commit is contained in:
parent
18843fc99b
commit
a783b26ce6
116
src/main/java/com/sunyard/sge/bytes/BytesQueue.java
Normal file
116
src/main/java/com/sunyard/sge/bytes/BytesQueue.java
Normal file
@ -0,0 +1,116 @@
|
|||||||
|
package com.sunyard.sge.bytes;
|
||||||
|
|
||||||
|
|
||||||
|
import java.util.Iterator;
|
||||||
|
import java.util.LinkedList;
|
||||||
|
import java.util.List;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 字节流先入先出队列
|
||||||
|
* **非线程安全**
|
||||||
|
*/
|
||||||
|
public class BytesQueue {
|
||||||
|
|
||||||
|
// 字节队列
|
||||||
|
private List<byte[]>queue = new LinkedList<>();
|
||||||
|
// 有效字节起始位置指针
|
||||||
|
private int index = 0;
|
||||||
|
// 维护实时长度
|
||||||
|
private int length = 0;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 尾部添加
|
||||||
|
* @param datas
|
||||||
|
*/
|
||||||
|
public void push(byte[] datas){
|
||||||
|
if ( null == datas ) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
if ( datas.length == 0 ) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
if ( datas.length > Integer.MAX_VALUE - length ){
|
||||||
|
throw new IllegalArgumentException("too big");
|
||||||
|
}
|
||||||
|
|
||||||
|
queue.add( datas );
|
||||||
|
|
||||||
|
length += datas.length;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 获取字节
|
||||||
|
* @param multiple 整倍数
|
||||||
|
* @param reserve 保留
|
||||||
|
* @return 所有字节
|
||||||
|
*/
|
||||||
|
public byte[] pop(int multiple, int reserve){
|
||||||
|
|
||||||
|
if ( length <= reserve ) {
|
||||||
|
return new byte[0];
|
||||||
|
}
|
||||||
|
|
||||||
|
int len = length - reserve;
|
||||||
|
int raminder = len % multiple;
|
||||||
|
len -= raminder;
|
||||||
|
|
||||||
|
if ( 0 == len ) {
|
||||||
|
return new byte[0];
|
||||||
|
}
|
||||||
|
|
||||||
|
byte[] data = null;
|
||||||
|
int dataIndex = 0;
|
||||||
|
int needLen = len;
|
||||||
|
boolean isFirst = true;
|
||||||
|
Iterator<byte[]>it = queue.iterator();
|
||||||
|
while ( it.hasNext() ){
|
||||||
|
byte[] q = it.next();
|
||||||
|
// 首轮加速
|
||||||
|
if ( isFirst ) {
|
||||||
|
isFirst = false;
|
||||||
|
|
||||||
|
if ( 0 == index && q.length == needLen ) {
|
||||||
|
queue.remove(0);
|
||||||
|
index = 0;
|
||||||
|
length -= needLen;
|
||||||
|
return q;
|
||||||
|
}
|
||||||
|
data = new byte[ needLen ];
|
||||||
|
}
|
||||||
|
|
||||||
|
int hasLen = q.length - index;
|
||||||
|
System.out.println(String.format("-> %d %d %d", dataIndex, needLen, hasLen));
|
||||||
|
if ( hasLen == needLen ) {
|
||||||
|
System.arraycopy( q, index , data, dataIndex, needLen );
|
||||||
|
it.remove();
|
||||||
|
index = 0;
|
||||||
|
length -= needLen;
|
||||||
|
return data;
|
||||||
|
} else if ( hasLen > needLen ) {
|
||||||
|
System.arraycopy( q, index , data, dataIndex, needLen );
|
||||||
|
index += needLen;
|
||||||
|
length -= needLen;
|
||||||
|
return data;
|
||||||
|
} else {
|
||||||
|
System.arraycopy( q, index , data, dataIndex, hasLen );
|
||||||
|
it.remove();
|
||||||
|
index = 0;
|
||||||
|
length -= hasLen;
|
||||||
|
dataIndex += hasLen;
|
||||||
|
needLen = len - dataIndex;
|
||||||
|
if ( 0 == needLen ) {
|
||||||
|
return data;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
throw new RuntimeException("pop error");
|
||||||
|
}
|
||||||
|
|
||||||
|
public byte[] pop(int reserve){
|
||||||
|
return pop( 1, reserve );
|
||||||
|
}
|
||||||
|
public byte[] pop(){
|
||||||
|
return pop( 1, 0 );
|
||||||
|
}
|
||||||
|
}
|
||||||
4
src/main/java/com/sunyard/sge/log/SydLogFactory.java
Normal file
4
src/main/java/com/sunyard/sge/log/SydLogFactory.java
Normal file
@ -0,0 +1,4 @@
|
|||||||
|
package com.sunyard.sge.log;
|
||||||
|
|
||||||
|
public class SydLogFactory {
|
||||||
|
}
|
||||||
35
src/test/java/test/ByteQueueTest.java
Normal file
35
src/test/java/test/ByteQueueTest.java
Normal file
@ -0,0 +1,35 @@
|
|||||||
|
package test;
|
||||||
|
|
||||||
|
import com.sunyard.sge.bytes.BytesQueue;
|
||||||
|
import org.junit.Assert;
|
||||||
|
import org.junit.Test;
|
||||||
|
|
||||||
|
import java.util.Random;
|
||||||
|
|
||||||
|
public class ByteQueueTest {
|
||||||
|
|
||||||
|
@Test
|
||||||
|
public void case1() {
|
||||||
|
BytesQueue queue = new BytesQueue();
|
||||||
|
int max = 1000;
|
||||||
|
|
||||||
|
for (int i = 0; i < max; i++) {
|
||||||
|
int r = new Random().nextInt(4096);
|
||||||
|
queue.push(new byte[r]);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
while (true) {
|
||||||
|
byte[] data = queue.pop(16, 16);
|
||||||
|
Assert.assertEquals(data.length % 16, 0);
|
||||||
|
if (0 == data.length) {
|
||||||
|
data = queue.pop();
|
||||||
|
Assert.assertTrue( data.length >= 16 );
|
||||||
|
data = queue.pop();
|
||||||
|
Assert.assertEquals(0, data.length);
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
Loading…
Reference in New Issue
Block a user