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.代码如下:

  1. import java.io.ByteArrayInputStream;
  2. import java.io.ByteArrayOutputStream;
  3. import java.io.IOException;
  4. import java.util.zip.GZIPInputStream;
  5. import java.util.zip.GZIPOutputStream;
  6. /**
  7. *
  8. *Module:          ZipUtil.java
  9. *Description:    对字符串的压缩及解压
  10. *Company:
  11. *Author:           pantp
  12. *Date:             May 6, 2012
  13. */
  14. public class ZipStrUtil {
  15. public static void main(String[] args) throws IOException {
  16. // 字符串超过一定的长度
  17. String str = "ABCdef123中文~!@#$%^&*()_+{};/1111111111111111111111111AAAAAAAAAAAJDLFJDLFJDLFJLDFFFFJEIIIIIIIIIIFJJJJJJJJJJJJALLLLLLLLLLLLLLLLLLLLLL" +
  18. "LLppppppppppppppppppppppppppppppppppppppppp===========================------------------------------iiiiiiiiiiiiiiiiiiiiiii";
  19. System.out.println("\n原始的字符串为------->" + str);
  20. float len0=str.length();
  21. System.out.println("原始的字符串长度为------->"+len0);
  22. String ys = compress(str);
  23. System.out.println("\n压缩后的字符串为----->" + ys);
  24. float len1=ys.length();
  25. System.out.println("压缩后的字符串长度为----->" + len1);
  26. String jy = unCompress(ys);
  27. System.out.println("\n解压缩后的字符串为--->" + jy);
  28. System.out.println("解压缩后的字符串长度为--->"+jy.length());
  29. System.out.println("\n压缩比例为"+len1/len0);
  30. //判断
  31. if(str.equals(jy)){
  32. System.out.println("先压缩再解压以后字符串和原来的是一模一样的");
  33. }
  34. }
  35. /**
  36. * 字符串的压缩
  37. *
  38. * @param str
  39. *            待压缩的字符串
  40. * @return    返回压缩后的字符串
  41. * @throws IOException
  42. */
  43. public static String compress(String str) throws IOException {
  44. if (null == str || str.length() <= 0) {
  45. return str;
  46. }
  47. // 创建一个新的 byte 数组输出流
  48. ByteArrayOutputStream out = new ByteArrayOutputStream();
  49. // 使用默认缓冲区大小创建新的输出流
  50. GZIPOutputStream gzip = new GZIPOutputStream(out);
  51. // 将 b.length 个字节写入此输出流
  52. gzip.write(str.getBytes());
  53. gzip.close();
  54. // 使用指定的 charsetName,通过解码字节将缓冲区内容转换为字符串
  55. return out.toString("ISO-8859-1");
  56. }
  57. /**
  58. * 字符串的解压
  59. *
  60. * @param str
  61. *            对字符串解压
  62. * @return    返回解压缩后的字符串
  63. * @throws IOException
  64. */
  65. public static String unCompress(String str) throws IOException {
  66. if (null == str || str.length() <= 0) {
  67. return str;
  68. }
  69. // 创建一个新的 byte 数组输出流
  70. ByteArrayOutputStream out = new ByteArrayOutputStream();
  71. // 创建一个 ByteArrayInputStream,使用 buf 作为其缓冲区数组
  72. ByteArrayInputStream in = new ByteArrayInputStream(str
  73. .getBytes("ISO-8859-1"));
  74. // 使用默认缓冲区大小创建新的输入流
  75. GZIPInputStream gzip = new GZIPInputStream(in);
  76. byte[] buffer = new byte[256];
  77. int n = 0;
  78. while ((n = gzip.read(buffer)) >= 0) {// 将未压缩数据读入字节数组
  79. // 将指定 byte 数组中从偏移量 off 开始的 len 个字节写入此 byte数组输出流
  80. out.write(buffer, 0, n);
  81. }
  82. // 使用指定的 charsetName,通过解码字节将缓冲区内容转换为字符串
  83. return out.toString("GBK");
  84. }
  85. /**
    * 根据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;
    }

  86. }

转载于:https://www.cnblogs.com/zengdingxin/p/3183947.html

Java 压缩字符串相关推荐

  1. Java压缩字符串的方法收集

    说明: 1.一般来说要实现压缩,那么返回方式一般是用byte[]数组. 2.研究发现byte[]数组在转成可读的String时,大小会还原回原来的. 3.如果采用压缩之后不可读的String时,互相转 ...

  2. java压缩字符串_Java压缩字符串的方法收集

    /*** * 压缩GZip * *@paramdata *@return */ public static byte[] gZip(byte[] data) {byte[] b = null;try{ ...

  3. java 字符串格式替换_[Java] - 格式字符串替换方法

    Java 字符串格式替换方法有两种,一种是使用String.format(...),另一种是使用MessageFormat.format(...) 如下: import java.text.Messa ...

  4. java中字符串压缩成bcd码_Java 压缩 / 解压缩字符串

    Java使用压缩库为常规压缩提供了Deflater类.它还提供了DeflaterOutputStream,它使用Deflater类通过压缩(压缩)数据流,然后将压缩后的数据写入另一个输出流来过滤数据流 ...

  5. 字符串压缩 java_如何在Java中压缩字符串?

    如何在Java中压缩字符串? 我使用GZIPOutputStream或ZIPOutputStream压缩字符串(我的2222235278130938882小于20),但压缩结果比原始字符串长. 在某个 ...

  6. Java 缩小字符串( Compact String)和 压缩字符串(Compressed String)

    正如我们在上面文章提到的内容,在英文语境中上面 2 个方法还是有区别的,在中文环境下主要表达就是字符串压缩. JDK 6 使用的压缩字符串方法,主要原因是我们修改了 String 的存储结构,char ...

  7. java 字符串 压缩_用JAVA实现字符串压缩算法

    public class Test3 { /** * 用JAVA实现字符串压缩算法. 将字符串 aaabcdda 编程实现将其转换为 3a1b1c2d1a : * * @param str * 需要转 ...

  8. Java压缩技术(四) GZIP——Java原生实现

    转载自  Java压缩技术(四) GZIP--Java原生实现 GZIP常常用在linxu环境下,是一种非常简单的压缩算法.在Java实现API中,它仅仅包含两个实现类:GZIPInputStream ...

  9. java压缩文件读取_用Java读取/写入压缩和非压缩文件

    java压缩文件读取 这篇文章的主要原因是尝试不要重复自己( DRY ),因为通常,我会遇到递归的需求,即读写压缩的和非压缩的文件(主要是JSON和CSV). 首先让我们看看如何读取文本文件. 注意我 ...

最新文章

  1. 如何使用资源和样式调整控件外观
  2. 计算网络经典书籍--计算机网络:自顶向下方法
  3. sap会计期间打开关闭
  4. GPU上的相似性检查(PNSR和SSIM)
  5. 前端笔记-使用JavaScript防止空表单提交
  6. Spring MVC 入门基础(一)
  7. 摘来的 esri 的 js 的 一些东西 来自ESRI中国社区 by xiaoyaohu
  8. Android9怎么剪辑音频,音频剪辑铃声制作
  9. 谷粒商城-10-p193-p247
  10. 射频识别技术漫谈(17)——射频卡中数据的存储形式
  11. Android 多国语言
  12. [TJOI2019]唱、跳、rap和篮球——NTT+生成函数+容斥
  13. 程序员夏天穿格子衫,那么冬天穿什么?
  14. 单页应用请求服务器,单页Web应用
  15. 数据库sql对象名无效问题
  16. 检测输入数据中奇数和偶数的个数
  17. VS Code:推荐插件 - HTML格式化(包括JS、CSS)
  18. 当动作捕捉遇上圣诞节,原来如此有趣
  19. 推荐一款学习app:Enki
  20. 在vue 中 ,dom操作滚动条 scrollTop无效

热门文章

  1. SEO交换链接时需遵循哪些原则?
  2. 网页模板制作只为满足用户需求!
  3. 浅析那些你不知道的提升企业网站转化率的SEO优化技巧 !
  4. ruby网站部署到服务器,入门知识: 把代码部署到服务器, SSH
  5. 项目收获与体会_员工之声|在项目实践中提高,在团队合作中成长——参与项目有感...
  6. go语言学习(5)协程
  7. 深度学习必备:随机梯度下降(SGD)优化算法及可视化
  8. 基于机器学习的web异常检测——基于HMM的状态序列建模,将原始数据转化为状态机表示,然后求解概率判断异常与否...
  9. MySQL开启federated引擎实现数据库表映射
  10. 命令 检查Linux服务器性能