org.voovan.tools.TStream Maven / Gradle / Ivy
package org.voovan.tools;
import java.io.BufferedInputStream;
import java.io.ByteArrayOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.util.Arrays;
/**
* 流操作类
*
* @author helyho
*
* Voovan Framework.
* WebSite: https://github.com/helyho/Voovan
* Licence: Apache v2 License
*/
public class TStream {
/**
* 从 InputStream 读取定长字符串
* @param inputStream 输入流
* @param length 产度
* @return 字节数组
* @throws IOException IO 异常
*/
public static byte[] read(InputStream inputStream,int length) throws IOException{
byte[] resultBytes = new byte[length];
int readLength = inputStream.read(resultBytes);
if(readLength>0) {
resultBytes = Arrays.copyOfRange(resultBytes, 0, readLength);
}
return resultBytes.length==0?null:resultBytes;
}
/**
* 从 InputStream 读取一行
* @param inputStream 输入流
* @return 字符串
* @throws IOException IO 异常
*/
public static String readLine(InputStream inputStream) throws IOException{
String lineStr = "";
StringBuilder lineStrBuilder= new StringBuilder();
ByteArrayOutputStream byteOutputStream = new ByteArrayOutputStream();
while(true){
int singleChar = inputStream.read();
if(singleChar==65535 || singleChar == -1) {
break;
}
else{
byteOutputStream.write(singleChar);
if(singleChar == '\n'){
break;
}
}
}
lineStrBuilder.append(new String(byteOutputStream.toByteArray()));
lineStr = lineStrBuilder.toString();
return lineStr.isEmpty()?null:lineStr.trim();
}
/**
* 从 InputStream 读取一段,使用 byte数组 分割
* 返回的 byte数组中不包含分割 byte 数组的内容
* @param inputStream 输入流
* @param splitByte 分割字节数组
* @return 字节数组
* @throws IOException IO 异常
*/
public static byte[] readWithSplit(InputStream inputStream,byte[] splitByte) throws IOException{
byte[] resultBytes = new byte[0];
while(true){
byte[] tempbyte = new byte[1];
int readSize = inputStream.read(tempbyte);
if(readSize==-1) {
break;
}
else{
resultBytes = TStream.byteArrayConcat(resultBytes, resultBytes.length, tempbyte, tempbyte.length);
}
if(resultBytes.length>=splitByte.length){
byte[] resultLastedBytes = Arrays.copyOfRange(resultBytes, resultBytes.length-splitByte.length, resultBytes.length);
if(Arrays.equals(resultLastedBytes, splitByte)){
resultBytes = Arrays.copyOfRange(resultBytes, 0, resultBytes.length-splitByte.length);
break;
}
}
}
return resultBytes.length==0?null:resultBytes;
}
/**
* 从 InputStream 读取全部字节
* @param inputStrem 输入流
* @return 字节数组
* @throws IOException IO 异常
*/
public static byte[] readAll(InputStream inputStrem) throws IOException{
ByteArrayOutputStream byteOutputStream = new ByteArrayOutputStream();
BufferedInputStream bufferedInputStream = new BufferedInputStream(inputStrem);
while(true)
{
byte[] tempBytes = new byte[1024];
int readSize = bufferedInputStream.read(tempBytes);
if(readSize>0){
byteOutputStream.write(tempBytes,0,readSize);
}
else if(readSize==-1){
break;
}
}
bufferedInputStream.close();
return byteOutputStream.size()==0?null:byteOutputStream.toByteArray();
}
/**
* 字节数组拼接
* @param firstBytes 首个字节数组
* @param firstBytesLength 首个字节数组长度
* @param lastBytes 拼接在后的字节数组
* @param lastBytesLength 拼接在后的字节数组长度
* @return 字节数组
*/
public static byte[] byteArrayConcat(byte[] firstBytes,int firstBytesLength, byte[] lastBytes,int lastBytesLength) {
if (lastBytes.length == 0)
return firstBytes;
byte[] target = new byte[firstBytesLength + lastBytesLength];
System.arraycopy(firstBytes, 0, target, 0, firstBytesLength);
System.arraycopy(lastBytes, 0, target, firstBytes.length,lastBytesLength);
return target;
}
public static int contains(byte[] mark, byte target){
for(int i = mark.length-1 ; i >= 0; i--){
if(mark[i] == target){
return i ;
}
}
return -1;
}
}