字符串压缩:

之前在做Android客户端开发的时候,需要请求一个字典类型的http请求接口,由于接口json数据过大,达到6M,当时建议后端对接口返回的json数据逻辑进行处理,在服务端将json串压缩,然后在客户端进行解压,最后在将数据显示在客户端。

Java实现字符串压缩API:

压缩算法有多种,我说知道和接触有java I/O自带的zip和gzip两种方式,此次的压缩和解压用到的主要就是GZIPOutputStream和GZIPInputStream类,看一下例子:

字符串压缩代码:

public static String compress(String source) {ByteArrayOutputStream bos = new ByteArrayOutputStream();try {GZIPOutputStream gos = new GZIPOutputStream(bos);gos.write(source.getBytes("ISO-8859-1"));gos.close();return bos.toString("ISO-8859-1");} catch (IOException var3) {System.out.println(var3.getStackTrace().toString());return source;}
}

字符串解压代码:

/***** @Method compress  字符串解压方法* @author source 需要传入待解压的字符串* 返回值   返回解压后的字符串****/public static String uncompress(String source) {if (source != null && source.length() != 0) {try {ByteArrayOutputStream bos = new ByteArrayOutputStream();ByteArrayInputStream bis = new ByteArrayInputStream(source.getBytes("ISO-8859-1"));GZIPInputStream gis = new GZIPInputStream(bis);byte[] data = new byte[1024];for(int len = gis.read(data); len != -1; len = gis.read(data)) {bos.write(data, 0, len);}return bos.toString();} catch (IOException var6) {System.out.println(var6.getStackTrace().toString());return source;}} else {return source;}}

测试代码:

public static void main(String[] args) {// 字符串超过一定的长度  String str = "ggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggfdgfdgf"+ "ggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggg"+ "gggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggABCdef123中文~!@#$%^&*()_+{fd}"+ ";/1111111111111111111111111AAAAAAAAAAAJDLFJDLFJDLFJLDFFFFJEIIIIIIIIIIFJJJJJJJJJJJJALLLLLLLLLLLLLLLLLLLLLLdddddddddddddddddfdfdfdfdfdfdd"+ "dddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddessdfrdfdfd"+ "ddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddd"+ "ddddddddddddddddddddddddddddddddddddddddddddddddddddddgfgggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggf"+ "ddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddd"+ "ddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddd"+ "ddddddddddddddddddddddddddddddddddddddddddddggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggg" +  "LLppppppppppppppppppppppppppppppppppppppppp===========================------------------------------iiiiiiiiiiiiiiiiiiiiiiiggggggggggggg";//字符串原始长度处理String originalStr = str;System.out.println("原始的字符串长度:" + originalStr.length());//字符串压缩状态处理String compressStr = compress(originalStr);System.out.println("压缩的字符串长度:" + compressStr.length());//字符串解压方法以及测试解压后字符串长度String uncompress = uncompress(compressStr);System.out.println("解压后的字符串长度:" + uncompress.length());//字符串压缩率float rate = (float)compressStr.length() / uncompress.length();System.out.println("字符串压缩率:" + rate);if(originalStr.equals(uncompress)){System.out.println("解压后的字符串和原始的字符串长度一样");}}

控制台打印输出结果:

原始的字符串长度:1474

压缩的字符串长度:136

解压后的字符串长度:1474

字符串压缩率:0.09226594

如图通过调研compress压缩方法将原始字符串压缩,原始字符串的长度为1474个字节,压缩后字符串大小变为136个字节,字符串的压缩率达到91%。

Java代码实现文件压缩与解压:

api说明:

1:添加ZipTools包(主要解决中文路径压缩解压乱码问题)

2:文件压缩需要用到的类 ZipOutputStream(zip文件压缩需要用到的类)

3:ZipEntry 压缩文件的子文件对象,用于保存压缩文件中文件及其文件夹的一个实列

4:ZipFile 压缩文件的实列,用于zip的解压操作

文件压缩相关代码:

 /***** * @Method createZipStream 创建ZIP输出流实例* @param filePath 需要压缩的文件以及路径* @param fileOutPath 生成压缩的文件以及路径* ****/public static void createZipStream(String filePath, String fileOutPath) throws IOException{OutputStream os = new FileOutputStream(fileOutPath);//根据压缩的文件路径创建要输出的文件CheckedOutputStream cos = new CheckedOutputStream(os, new CRC32());//检查输出流,采用crc算法,保证文件的一致性ZipOutputStream zos = new ZipOutputStream(cos);//定义zip文件输出流zos.setEncoding("GBK");//设置编码格式,防止中文乱码File file = new File(filePath);//需要压缩的文件以及文件夹对象compressFile(zos,file);zos.close();cos.close();os.close();System.out.println("压缩文件完成");}/***** @Method compressFile* @param ZipOutputStream zip文件输出流* @param File 要压缩的文件对象****/public static void compressFile(ZipOutputStream zos, File file) throws IOException{String fp = file.getPath().substring(3,file.getPath().length());//去掉盘符if(file.isDirectory()){//如果是文件目录,添加当前文件夹到zip文件流中zos.putNextEntry(new ZipEntry(fp + File.separator));for(File f: file.listFiles()){compressFile(zos, f);}}else{//如果是文件目录,添加当前文件到zip文件流中System.out.println("正在压缩文件:"+file.getPath());zos.putNextEntry(new ZipEntry(fp));InputStream is = new FileInputStream(file.getPath());//用字节方式读取文件BufferedInputStream bis = new BufferedInputStream(is);//创建一个缓存区byte [] b = new byte[1024];//将读取的字节写到zip文件流中while (bis.read(b) != -1) {zos.write(b);}bis.close();is.close();}}测试函数以及返回示例:public static void main(String[] args) throws IOException {createZipStream(filePath,fileOutPath);//      unCompressFile(fileOutPath);}

打印压缩文件过程:

正在压缩文件:D:\MyDrivers\backup\dgsetup.exe

正在压缩文件:D:\MyDrivers\backup\driverlist.mf

正在压缩文件:D:\MyDrivers\backup\Realtek PCIe GBE Family Controller\rt640x64.inf_amd64_98de0ddb0966f29b\rt640x64.inf

正在压缩文件:D:\MyDrivers\backup\Realtek PCIe GBE Family Controller\rt640x64.inf_amd64_98de0ddb0966f29b\rt640x64.PNF

正在压缩文件:D:\MyDrivers\backup\Realtek PCIe GBE Family Controller\rt640x64.inf_amd64_98de0ddb0966f29b\rt640x64.sys

压缩文件完成

文件解压相关函数:

/**** * @Method unCompressFile* @param filePath 需要解压的文件路径****/public static  void unCompressFile(String  filePath) throws IOException{File file = new File(filePath);if(!file.exists()){System.out.println("当前压缩文件不存在");return;}ZipFile zipFile = new ZipFile(file.getPath(),"GBK");for(Enumeration<ZipEntry> enumeration = zipFile.getEntries();enumeration.hasMoreElements();){//循环获取zip文件压缩实例ZipEntry zipEntry = enumeration.nextElement();//获取元素//如果是空文件不解压if(!zipEntry.getName().equals(File.separator)){String path = "D:\\" + zipEntry.getName();System.out.println("文件名:" + path);int len = path.length();//创建解压目录if(path.substring(len - 1, len).equals("\\")){File createFile = new File(path);if(!createFile.exists()){createFile.mkdirs();//如果当前文件不存在,则创建解压目录}}else{//创建解压后的文件OutputStream os = new FileOutputStream(new File(path));BufferedOutputStream bos = new BufferedOutputStream(os);//带缓冲的写出流InputStream is = zipFile.getInputStream(zipEntry);//读取元素BufferedInputStream bis = new BufferedInputStream(is);CheckedInputStream cis = new CheckedInputStream(bis, new CRC32());//检查读取流,用CRC算法检查文件是否一致性byte[] b = new byte[1024];//字节数组,每次读取1024个字节//循环读取解压文件的值,将zip流写入新文件中while (cis.read(b) != -1) {bos.write(b);}cis.close();bis.close();is.close();bos.close();os.close();}}else{System.out.println("目录名:" + zipEntry.getName());}}System.out.println("文件解压结束");}测试解压方法:
public static void main(String[] args) throws IOException {//       createZipStream(filePath,fileOutPath);unCompressFile(fileOutPath);}

打印解压文件结果:

文件名:D:\MyDrivers\backup\

文件名:D:\MyDrivers\update\

文件名:D:\MyDrivers\backup\dgsetup.exe

文件名:D:\MyDrivers\backup\Realtek PCIe GBE Family Controller\rt640x64.inf_amd64_98de0ddb0966f29b\

文件名:D:\MyDrivers\software\disapp\

文件名:D:\MyDrivers\backup\Realtek PCIe GBE Family Controller\rt640x64.inf_amd64_98de0ddb0966f29b\rt640x64.inf

文件名:D:\MyDrivers\backup\Realtek PCIe GBE Family Controller\

文件名:D:\MyDrivers\backup\Realtek PCIe GBE Family Controller\rt640x64.inf_amd64_98de0ddb0966f29b\rt640x64.PNF

文件名:D:\MyDrivers\backup\driverlist.mf

文件名:D:\MyDrivers\

文件名:D:\MyDrivers\backup\Realtek PCIe GBE Family Controller\rt640x64.inf_amd64_98de0ddb0966f29b\rt640x64.sys

文件名:D:\MyDrivers\hotfix\

文件名:D:\MyDrivers\software\

文件解压结束

自己封装的字符串压缩和文件压缩库:

项目目录结构截图如下:

java_zip.jar包是我封装的字符串和文件压缩jar,slf4j-api-1.7.21.jar,slf4j-nop-1.7.2.jar为代码依赖的日志包,ziptools.jar为JavaApi  zip防止中文乱码开发的包。

Api演示代码如下:

public static String filePath = "D:/MyDrivers/";public static String fileOutPath = "D:/MyDrivers.zip";//在lib文件中有一个Java_zip.jarpublic static void main(String[] args) {// 字符串超过一定的长度  String str = "ggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggfdgfdgf"+ "ggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggg"+ "gggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggABCdef123中文~!@#$%^&*()_+{fd}"+ ";/1111111111111111111111111AAAAAAAAAAAJDLFJDLFJDLFJLDFFFFJEIIIIIIIIIIFJJJJJJJJJJJJALLLLLLLLLLLLLLLLLLLLLLdddddddddddddddddfdfdfdfdfdfdd"+ "dddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddessdfrdfdfd"+ "ddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddd"+ "ddddddddddddddddddddddddddddddddddddddddddddddddddddddgfgggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggf"+ "ddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddd"+ "ddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddd"+ "ddddddddddddddddddddddddddddddddddddddddddddggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggg" +  "LLppppppppppppppppppppppppppppppppppppppppp===========================------------------------------iiiiiiiiiiiiiiiiiiiiiiiggggggggggggg";System.out.println("字符串初始长度:" + str.length());String compressstr = GzipUtils.compress(str);System.out.println("压缩后字符串长度:" + compressstr.length());String uncompress = GzipUtils.uncompress(compressstr);System.out.println("解压后字符串长度:" + uncompress.length());//压缩文件
//      ZipUtil.pack(new File(filePath), new File(fileOutPath));//解压文件ZipUtil.unpack(new File(fileOutPath), new File(filePath));

项目Demo地址下载:

https://download.csdn.net/download/zhangmingziliao/10969290

JAVA处理字符串压缩以及文件压缩相关推荐

  1. 使用java iTest实现PDF大文件压缩——将文件过大的图片PDF文件压缩成小一些的图片PDF文件

    一.需求 项目中需要将文件大小过大的PDF文件,压缩成小PDF文件.通过iText的API,可以实现此需求.在保证文件不失真的前提下,将PDF大文件压缩成小文件. 二.代码 import com.it ...

  2. java pdf文件压缩_PDF文件压缩转换教程

    现在在很多的网站上传文件的时候,不知道大家有没有遇到因为pdf文件太大,不能上传这种情况.还有很多限制PDF文件大小,由于PDF文件较多,那么就会导致效率大大减小.如果PDF文件过大进行PDF文件传输 ...

  3. [Unity-26] AnimationClip压缩-动画文件压缩

    动画压缩方法 一.常用方法 1. Rig->Animation Type:改为Generic 2. Animations->Anim.Compression:Optimal 二.高级方法 ...

  4. 如何压缩PDF文件 压缩PDF文件的详细图文步骤

    我有两个PDF文件要压缩,对于"压缩PDF文件比较棘手,所以在晚上搜索到了解决方法. 下面说一下我是如何操作的吧. 工欲善其事,必先利其器.首先亮出今天的武器--Adobe Acrobat  ...

  5. java读取字符串,生成txt文件

    /*** 读取字符串,生成txt 文件 已解决未设置编码时,在项目中直接打开文件,中文乱码问题* WriteText.writeToText(musicInfo,fileName)直接调用* * @a ...

  6. java web 实现多个文件压缩下载

    文件下载时,我们可能需要一次下载多个文件.批量下载文件时,需要将多个文件打包为zip,然后再下载.实现思路有两种:一是将所有文件先打包压缩为一个文件,然后下载这个压缩包,二是一边压缩一边下载,将多个文 ...

  7. java gzip 多个文件_Java Zip多文件压缩和 GZIP压缩

    /** * 多文件压缩 * * @author Administrator * */ public class ZipCompress { public static void main(String ...

  8. linux把test目录打包,linux的基本操作(文件压缩与打包)

    文件的压缩与打包 在windows下我们接触最多的压缩文件就是.rar格式的了.但在linux下这样的格式是不能识别的,它有自己所特有的压缩工具.但有一种文件在windows和linux下都能使用那就 ...

  9. 【Android 内存优化】图片文件压缩 ( Android 原生 API 提供的图片压缩功能能 | 图片质量压缩 | 图片尺寸压缩 )

    文章目录 一. 图片压缩 二. 图片文件压缩类型 三. Android 原生 API 提供的质量压缩 四. Android 原生 API 提供的尺寸压缩 一. 图片压缩 图片压缩 : ① 文件压缩 : ...

  10. DCMTK:压缩DICOM文件

    DCMTK:压缩DICOM文件 压缩DICOM文件 压缩DICOM文件 #include "dcmtk/config/osconfig.h" #include "dcmt ...

最新文章

  1. Neutron — Hierarchical Port Binding(层次化端口绑定)
  2. NOSQL 之 cassadra 安装与集群配置
  3. java中的codereview
  4. 【计算机网络实验·北航】实验一:网络实验入门(1)
  5. php array =,PHP Array 函数
  6. java 打印hashmap值_HashMap中输出key-value值得方法
  7. Android API Guides---Bluetooth
  8. ssh提示connection refused_2020高考语法填空必会技巧之有提示词(一)
  9. 使用MyBatis框架连接MySQL数据库查询记录,全部步骤
  10. 控制文件丢失 如何恢复
  11. 文件夹病毒残余文件的解决办法
  12. 全球国家和地区代码列表
  13. Angular设置代理
  14. 完美卸载mac电脑里的软件及残留清理教程
  15. 【d3】树图-各种效果集合(附效果图)
  16. 第十四天 09-文件与内容查找与归档压缩爆破
  17. html封套成exe,一种使用方便的封套的制作方法
  18. MySQL修改自增字段的自增值
  19. 图鉴:《100名互联网公司老板采访实录》
  20. 调用U9系统里的新增杂收服务服务

热门文章

  1. 第三方支付易宝支付的具体实现
  2. 计算机室 多媒体教室制度,多媒体教室计算机室规章制度.doc
  3. 对侯捷《Word 排版艺术》的期待
  4. java制作游戏开始界面,太香了
  5. 冰点还原精灵和惠普增霸卡安装软件的方法
  6. 随机生成爆破密码字典.txt
  7. 新中大财务软件服务器路径修改,新中大软件最常用的操作手册
  8. 计算机电子表操作格试题,全国计算机等级考试四Excel电子表格操作试题
  9. SQL Prompt 没激活联网后突然无法使用 解决办法
  10. Android 下载的文件进行MD5校验