概述
如题,我们在对接传统项目的厂商或者机构,通常使用Socket进行传输,他们的api文档往往会有一些特别的要求, 最近就碰到了要求数据通过xml报文进行传输,传输前使用标准zip算法进行流压缩,而在收到回执报文后,需要先解压再解析对应的报文。
网上查了许久找不到参考的代码,特意写出来公开供大家参考。
1、通讯流压缩
/**
* zip压缩
* @param byt
* @return
* @throws IOException
*/
public byte[] compress(byte[] byt) throws IOException {
ByteArrayOutputStream bos = new ByteArrayOutputStream();
ZipOutputStream zom = null;
//zip压缩
zom = new ZipOutputStream(bos);
//设置压缩方法
zom.setMethod(ZipOutputStream.DEFLATED);
zom.setEncoding("gbk");
zom.putNextEntry(new org.apache.tools.zip.ZipEntry("data"));
zom.write(byt);
zom.closeEntry();
zom.finish();
byte[] bytt = bos.toByteArray();
IOUtils.closeQuietly(zom);
IOUtils.closeQuietly(bos);
return bytt;
}
2、通讯流解压
/**
* zip解压
* @param readOnce
* @return
* @throws Exception
*/
private String decompress(byte[] zipByte) throws Exception {
ByteArrayOutputStream byteArrayOutputStream = new ByteArrayOutputStream();
ByteArrayInputStream byteArrayInputStream = new ByteArrayInputStream(zipByte);
ZipInputStream zipInputStream = new ZipInputStream(byteArrayInputStream);
ZipEntry nextEntry = zipInputStream.getNextEntry();
while(nextEntry != null){
byte[] temp = new byte[1024];
int n = 0;
while( (n = zipInputStream.read(temp)) != -1){
byteArrayOutputStream.write(temp,0,n);
}
//关闭当前文件或目录
zipInputStream.closeEntry();
//读取下一个文件或目录
nextEntry = zipInputStream.getNextEntry();
}
String str = new String(byteArrayOutputStream.toByteArray(),LNCCBConstant.GBK.toString());
IOUtils.closeQuietly(byteArrayOutputStream);
IOUtils.closeQuietly(zipInputStream);
IOUtils.closeQuietly(byteArrayInputStream);
return str;
}
通常会配合加密一起使用,但其实这种方法还是存在弊端,因为java语言中Socket通讯经过包装以后,转为了zip流,并不能做到按字节,一个一个字节的去读取通讯流回执,如果内容特别多会造成读取不全的情况。
以上谨为个人看法,欢迎与大家交流。
最后
以上就是甜甜火车为你收集整理的xml报文传输,使用标准zip算法压缩、解压的全部内容,希望文章能够帮你解决xml报文传输,使用标准zip算法压缩、解压所遇到的程序开发问题。
如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。
本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
发表评论 取消回复