Java 压缩字符串
1.引言
最近在做项目中,平台提供一个http服务给其他系统调用,然后我接收到其他系统的json格式的报文后去解析,然后用拿到的数据去调用corba服务,我再把corba的返回值封装完成json字符串返回给外部系统。遇到一个接口去调用corba服务,然后corba返回的数据经过封装后字符串的长度达到7M左右,导致http客户端无法正常的接收完所有的数据。你可能会说这个接口设计的不合理,为什么不增加查询条件把查询条件范围缩小一点?但是,这个不是本节要讨论的内容,主要是因为corba服务已经发布用了很久且不在此次项目改造范围之内,再者这个corba服务已经上线用了N久,轻易的改变可能会导致未知的错误。签于此,我想到可以把json格式的字符串给压缩,然后客户端再解压。(一是字符串的压缩比例比较的高,二是字符串的压缩和解压实现起来也比较简单)。虽然,最后没有用到字符串的压缩和解压的方式,而是修改客户端(1.http客户端进一步精确查询条件 2.读取返回数据流采用循环读取的方式)来解决此问题,我还是把字符串的压缩和解压做一下简单的记录。
2.关于压缩与解压
压缩算法有多种,我说知道和接触有java I/O自带的zip和gzip两种方式。
本节主要来简单介绍一下在系统交互之间遇到大容量的字符串数据交互时,采用一端压缩,另一端再解压的方式来发送和接收数据。
关于此次的压缩和解压用到的主要就是GZIPOutputStream和GZIPInputStream类,此类的相关介绍在JDK中有详细的介绍,这里就不再累述了
3.代码如下:
- import java.io.ByteArrayInputStream;
- import java.io.ByteArrayOutputStream;
- import java.io.IOException;
- import java.util.zip.GZIPInputStream;
- import java.util.zip.GZIPOutputStream;
- /**
- *
- *Module: ZipUtil.java
- *Description: 对字符串的压缩及解压
- *Company:
- *Author: pantp
- *Date: May 6, 2012
- */
- public class ZipStrUtil {
- public static void main(String[] args) throws IOException {
- // 字符串超过一定的长度
- String str = "ABCdef123中文~!@#$%^&*()_+{};/1111111111111111111111111AAAAAAAAAAAJDLFJDLFJDLFJLDFFFFJEIIIIIIIIIIFJJJJJJJJJJJJALLLLLLLLLLLLLLLLLLLLLL" +
- "LLppppppppppppppppppppppppppppppppppppppppp===========================------------------------------iiiiiiiiiiiiiiiiiiiiiii";
- System.out.println("\n原始的字符串为------->" + str);
- float len0=str.length();
- System.out.println("原始的字符串长度为------->"+len0);
- String ys = compress(str);
- System.out.println("\n压缩后的字符串为----->" + ys);
- float len1=ys.length();
- System.out.println("压缩后的字符串长度为----->" + len1);
- String jy = unCompress(ys);
- System.out.println("\n解压缩后的字符串为--->" + jy);
- System.out.println("解压缩后的字符串长度为--->"+jy.length());
- System.out.println("\n压缩比例为"+len1/len0);
- //判断
- if(str.equals(jy)){
- System.out.println("先压缩再解压以后字符串和原来的是一模一样的");
- }
- }
- /**
- * 字符串的压缩
- *
- * @param str
- * 待压缩的字符串
- * @return 返回压缩后的字符串
- * @throws IOException
- */
- public static String compress(String str) throws IOException {
- if (null == str || str.length() <= 0) {
- return str;
- }
- // 创建一个新的 byte 数组输出流
- ByteArrayOutputStream out = new ByteArrayOutputStream();
- // 使用默认缓冲区大小创建新的输出流
- GZIPOutputStream gzip = new GZIPOutputStream(out);
- // 将 b.length 个字节写入此输出流
- gzip.write(str.getBytes());
- gzip.close();
- // 使用指定的 charsetName,通过解码字节将缓冲区内容转换为字符串
- return out.toString("ISO-8859-1");
- }
- /**
- * 字符串的解压
- *
- * @param str
- * 对字符串解压
- * @return 返回解压缩后的字符串
- * @throws IOException
- */
- public static String unCompress(String str) throws IOException {
- if (null == str || str.length() <= 0) {
- return str;
- }
- // 创建一个新的 byte 数组输出流
- ByteArrayOutputStream out = new ByteArrayOutputStream();
- // 创建一个 ByteArrayInputStream,使用 buf 作为其缓冲区数组
- ByteArrayInputStream in = new ByteArrayInputStream(str
- .getBytes("ISO-8859-1"));
- // 使用默认缓冲区大小创建新的输入流
- GZIPInputStream gzip = new GZIPInputStream(in);
- byte[] buffer = new byte[256];
- int n = 0;
- while ((n = gzip.read(buffer)) >= 0) {// 将未压缩数据读入字节数组
- // 将指定 byte 数组中从偏移量 off 开始的 len 个字节写入此 byte数组输出流
- out.write(buffer, 0, n);
- }
- // 使用指定的 charsetName,通过解码字节将缓冲区内容转换为字符串
- return out.toString("GBK");
- }
/**
* 根据byte数组,生成文件
*
* @param bfile
* byte数组
* @param filePath
* 存储路径
* @param fileName
* 文件名称
* @return true:保存成功 false:保存失败
*/
public static boolean getFile(byte[] bfile, String filePath, String fileName) {
BufferedOutputStream bos = null;
FileOutputStream fos = null;
File file = null;
boolean result = true;
try {
File dir = new File(filePath);
if (!dir.exists() && dir.isDirectory()) {// 判断文件目录是否存在
dir.mkdirs();
}
file = new File(filePath + "\\" + fileName);
fos = new FileOutputStream(file);
bos = new BufferedOutputStream(fos);
bos.write(bfile);
} catch (Exception e) {
result = false;
e.printStackTrace();
} finally {
if (bos != null) {
try {
bos.close();
} catch (IOException e1) {
e1.printStackTrace();
}
}
if (fos != null) {
try {
fos.close();
} catch (IOException e1) {
e1.printStackTrace();
}
}
}return result;
}- }
Java 压缩字符串的更多相关文章
- Java压缩字符串工具类
StringCompressUtils.java package javax.utils; import java.io.ByteArrayInputStream; import java.io.By ...
- Java压缩字符串的方法收集
说明: 1.一般来说要实现压缩,那么返回方式一般是用byte[]数组. 2.研究发现byte[]数组在转成可读的String时,大小会还原回原来的. 3.如果采用压缩之后不可读的String时,互相转 ...
- Java实现 LeetCode 443 压缩字符串
443. 压缩字符串 给定一组字符,使用原地算法将其压缩. 压缩后的长度必须始终小于或等于原数组长度. 数组的每个元素应该是长度为1 的字符(不是 int 整数类型). 在完成原地修改输入数组后,返回 ...
- Java常量字符串String理解
Java常量字符串String理解 以前关于String的理解仅限于三点:1.String 是final类,不可继承2.String 类比较字符串相等时时不能用“ == ”,只能用 "eq ...
- Java String字符串/==和equals区别,str。toCharAt(),getBytes,indexOf过滤存在字符,trim()/String与StringBuffer多线程安全/StringBuilder单线程—— 14.0
课程概要 String 字符串 String字符串常用方法 StringBuffer StringBuilder String字符串: 1.实例化String对象 直接赋值 String str=& ...
- java截取字符串中的数字
java从字符串中提取数字 随便给你一个含有数字的字符串,比如: String s="eert343dfg56756dtry66fggg89dfgf"; 那我们如何把其中的数字提取 ...
- 三张图彻底了解Java中字符串的不变性
转载: 三张图彻底了解Java中字符串的不变性 定义一个字符串 String s = "abcd"; s中保存了string对象的引用.下面的箭头可以理解为"存储他的引用 ...
- java中字符串的非空判断
问题如下:在java 中 字符串为null 如何判断String str;if(str==null) ??str.equal("null") ?? 答:我觉得应该搞清楚字符串对象和 ...
- java中字符串String 转 int(转)
java中字符串String 转 int String -> int s="12345"; int i; 第一种方法:i=Integer.parseInt(s); 第二种方法 ...
随机推荐
- window.onload和window.document.readystate的探究
在编写前端页面的时候,我们时常需要对页面加载的状态进行判断,以便进行相应的操作. 比如在移动端,时常需要在页面完全加载完成之前,先显示一个loading的图标,等待页面完成加载完成后,才显示出真正要展 ...
- WLAN频段的选择
WLAN(无线局域网)通过射频技术,将设备之间互联.当前应用于WLAN组网的有WIFI,蓝牙等.蓝牙工作在2.4GHZ的ISM(工业.科研.医疗)频段,功率等级分为0dBm,10dBm,20dBm:发 ...
- 返回多个类型的对象,Tuple
一个方法 通常只有一个 返回对象,有时候 我们遇到 要放回两个不同类型的值的时候, 这个时候可以使用Tuple. 对象. Tupele 只支持 .net framework 4.0 以上版本. 来!先 ...
- WPF的二维绘图(二)——几何图形Geometry
在WPF的DrawingContext对象中,提供了基本的绘制椭圆和矩形的API:DrawEllipse和DrawRectangle.但是,这些是远远不够用的,我们在日常应用中,更多的是使用DrawG ...
- Apache ab压力测试时出现大量的错误原因分析
最近有一个测试任务,是测试nginx的并发请求到底能够达到多少的, 于是就用ab工具对其进行压力测试. 这压力测试一执行,问题就来了:发起10000次请求,并发100,错误的情况能达到30%--50% ...
- java的for循环冒号
背景:有一个小伙纸问我 下面的java代码是什么意思. for (final RouterInterface routeIface : curNode.getRouteInterfaces()){ … ...
- 9.8 js进阶总结3
DOM文档对象模型 DOM(document object model)文档对象模型,它定义了操作文档对象的接口. DOM 把一份html文档表示为一棵家谱树,使用parent(父),child(子) ...
- js中自己实现each方法来遍历多维数组
- 关于OPC的研究1]c# opc client源码调试和学习笔记
c# opc client是一个在网上下载的示例程序,调试的时候还是费了一番周折,服务器端程序来自king view6.55,另文介绍. 1.注册dll 程序中有一个名叫OPCDAAuto.dll的文 ...
- order_by_、group_by_、having的用法区别
写于 2012-11-20 22:14 doc文档上. Having 这个是用在聚合函数的用法.当我们在用聚合函数的时候,一般都要用到GROUP BY 先进行分组,然后再进行聚合函数的运算.运算完后 ...