我是靠谱客的博主 甜甜火车,最近开发中收集的这篇文章主要介绍xml报文传输,使用标准zip算法压缩、解压,觉得挺不错的,现在分享给大家,希望可以做个参考。

概述

如题,我们在对接传统项目的厂商或者机构,通常使用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算法压缩、解压所遇到的程序开发问题。

如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。

本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
点赞(34)

评论列表共有 0 条评论

立即
投稿
返回
顶部