数据的gzip压缩解压缩_使用GZIP和压缩数据

数据的gzip压缩解压缩

抽象

我们都知道用zip或gzip压缩文件的含义。 但是在Java中使用压缩文件并不像您想的那样简单,特别是如果您不是直接使用文件而是压缩流数据时。 我们会去:

  • 如何将字符串转换为压缩/压缩字节数组,反之亦然
  • 创建用于读取和写入文件的实用程序功能,而无需事先知道文件或流是否已gzip压缩。

基础

那么,为什么要压缩任何东西? 很简单,因为这是减少必须通过网络传送或存储到磁盘的数据量的好方法,因此可以提高操作速度。 根据文档的性质,典型的文本文件或消息可以减少10倍或更多。 当然,您将不得不考虑压缩和解压缩的成本,但是当您拥有大量数据时,这些成本将不会很大。

Java支持吗?

是的,Java支持在java.util.zip包中读写gzip文件。 它还支持zip文件以及流行的ZLIB压缩库的数据膨胀和缩小。

如何压缩/解压缩Java字符串?

这是有关如何使用DeflaterOutputStream压缩和解压缩String的示例。

这是使用Java内置压缩器的两种方法以及使用GZIP的方法:

  1. 使用DeflaterOutputStream是最简单的方法:
    enum StringCompressor {;public static byte[] compress(String text) {ByteArrayOutputStream baos = new ByteArrayOutputStream();try {OutputStream out = new DeflaterOutputStream(baos);out.write(text.getBytes("UTF-8"));out.close();} catch (IOException e) {throw new AssertionError(e);}return baos.toByteArray();}public static String decompress(byte[] bytes) {InputStream in = new InflaterInputStream(new ByteArrayInputStream(bytes));ByteArrayOutputStream baos = new ByteArrayOutputStream();try {byte[] buffer = new byte[8192];int len;while((len = in.read(buffer))>0)baos.write(buffer, 0, len);return new String(baos.toByteArray(), "UTF-8");} catch (IOException e) {throw new AssertionError(e);}}}
  2. 如果要直接使用充气机/充气机:
    enum StringCompressor2 {;public static byte[] compress(String text) throws Exception{byte[] output = new byte;Deflater compresser = new Deflater();compresser.setInput(text.getBytes("UTF-8"));compresser.finish();int compressedDataLength = compresser.deflate(output);byte[] dest = new byte[compressedDataLength];System.arraycopy(output, 0, dest, 0, compressedDataLength);return dest;}public static String decompress(byte[] bytes) throws Exception{Inflater decompresser = new Inflater();decompresser.setInput(bytes, 0, bytes.length);byte[] result = new byte[bytes.length *10];int resultLength = decompresser.inflate(result);decompresser.end();// Decode the bytes into a StringString outputString = new String(result, 0, resultLength, "UTF-8");return outputString;}}
  3. 使用GZIP的方法如下:
    enum StringGZipper {;private static String ungzip(byte[] bytes) throws Exception{InputStreamReader isr = new InputStreamReader(new GZIPInputStream(new ByteArrayInputStream(bytes)), StandardCharsets.UTF_8);StringWriter sw = new StringWriter();char[] chars = new char[1024];for (int len; (len = isr.read(chars)) > 0; ) {sw.write(chars, 0, len);}return sw.toString();}private static byte[] gzip(String s) throws Exception{ByteArrayOutputStream bos = new ByteArrayOutputStream();GZIPOutputStream gzip = new GZIPOutputStream(bos);OutputStreamWriter osw = new OutputStreamWriter(gzip, StandardCharsets.UTF_8);osw.write(s);osw.close();return bos.toByteArray();}}

如何解码字节流以同时允许GZip和普通流:

下面的代码将字节流转换为String(转储),而无需事先知道该流是否已压缩。

if (isGZIPStream(bytes)) {InputStreamReader isr = new InputStreamReader(new GZIPInputStream(new ByteArrayInputStream(bytes)), StandardCharsets.UTF_8);StringWriter sw = new StringWriter();char[] chars = new char[1024];for (int len; (len = isr.read(chars)) > 0; ) {sw.write(chars, 0, len);}dump = sw.toString();} else {dump = new String(bytes, 0, length, StandardCharsets.UTF_8);}
}

这是isGZIPStream方法的实现。 揭示关于GZIP_MAGIC背后的真相!

public static boolean isGZIPStream(byte[] bytes) {return bytes[0] == (byte) GZIPInputStream.GZIP_MAGIC && bytes[1] == (byte) (GZIPInputStream.GZIP_MAGIC >>> 8);
}

这是一种在不知道文件是否已压缩的情况下读取文件的简单方法(依赖于扩展名.gz)。

static Stream<String> getStream(String dir, @NotNull String fileName) throws IOException {File file = new File(dir, fileName);InputStream in;if (file.exists()) {in = new FileInputStream(file);} else {file = new File(dir, fileName + ".gz");in = new GZIPInputStream(new FileInputStream(file));}return new BufferedReader(new InputStreamReader(in)).lines();
}

翻译自: https://www.javacodegeeks.com/2015/01/working-with-gzip-and-compressed-data.html

数据的gzip压缩解压缩

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/338996.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

C语言开发单片机为啥都是全局变量形式?

01前言全局变量简直就是嵌入式系统的戈兰高地。冲突最激烈的双方是&#xff1a;1. 做控制的工程师&#xff1b;2. 做非嵌入式的软件工程师。02做控制的工程师特点他们普遍的理解就是“变量都写成全局该有多方便”。我之前面试过一个非常有名的做控制实验室里出来的PhD/Master&a…

ajax get请求_python测试开发django50.jquery发送Ajax请求(get)

前言有时候&#xff0c;我们希望点击页面上的某个按钮后&#xff0c;不刷新整个页面&#xff0c;给后台发送一个请求过去&#xff0c;请求到数据后填充到html上&#xff0c;这意味着可以在不重新加载整个网页的情况下&#xff0c;对网页的某部分进行更新。Ajax可以完美的实现。…

primefaces_PrimeFaces Mobile入门

primefaces介绍 如果您已经开发了利用PrimeFaces的应用程序&#xff0c;或者打算开发可在台式机和移动设备上使用的Web应用程序&#xff0c;请考虑将PrimeFaces Mobile用于您的移动实施。 这篇博客文章将介绍一些基础知识&#xff0c;以帮助您开始为现有的PrimeFaces应用程序开…

C语言指针这些使用技巧值得收藏!

指针用的好犹如神助&#xff0c;用不好会让你叫苦连连&#xff0c;但大多数人是用不好指针的&#xff0c;所以后来的很多语言都把指针封装&#xff0c;屏蔽。比如JAVA&#xff0c;java是没有指针的&#xff0c;但是很多地方都用到指针&#xff0c;不过不对用户开放&#xff0c;…

如何用python实现地图定位_基于 PyQt5 实现地图中定位相片拍摄位置

项目简介&#xff1a;本次项目主要学习了如何查找相片中的 Exif 信息&#xff0c;并通过 Exif 信息中的 GPS 数据在百度地图中进行定位标点&#xff0c;以确定相片的拍摄地点。本次实验的目的旨在通过包含 GPS 信息的相片进行取证调查&#xff0c;当然个人娱乐也可以&#xff0…

mysql数据库中的int类型_MySQL中int(M)和tinyint(M)数值类型中M值的意义

在一开始接触MySQL数据库时&#xff0c;对于int(M)及tinyint(M)两者数值类型后面的M值理解是最多能够插入数据库中的值不能大于M&#xff1b;后来工作后&#xff0c;也是一边学习一边使用&#xff0c;之后的理解是其中的M的意思是插入数据库中的值的字符长度不能大于M&#xff…

arquillian_使用Arquillian测试安全的EJB

arquillian从历史上讲&#xff0c;很难测试安全的EJB。 到目前为止&#xff0c;我一直在使用专有技术&#xff08;如JBossLoginContextFactory&#xff09;中所述的文章&#xff08; 使用Arquillian在WildFly 8.1.x上测试安全的EJB&#xff09;来测试安全的EJB。 在今年Devoxx…

api怎么写_使用Node.js原生API写一个web服务器

Node.js是JavaScript基础上发展起来的语言&#xff0c;所以前端开发者应该天生就会一点。一般我们会用它来做CLI工具或者Web服务器&#xff0c;做Web服务器也有很多成熟的框架&#xff0c;比如Express和Koa。但是Express和Koa都是对Node.js原生API的封装&#xff0c;所以其实不…

C语言预处理命令分类和工作原理

C语言编程过程中&#xff0c;经常会用到如 #include、#define 等指令&#xff0c;这些标识开头的指令被称为预处理指令&#xff0c;预处理指令由预处理程序&#xff08;预处理器&#xff09;操作。相比其他编程语言&#xff0c;C/C 语言更依赖预处理器&#xff0c;故在阅读或开…

查看mysql用户权限_mysql 如何查看该数据库用户具有哪些权限?

展开全部背景在了解动态权限之前&#xff0c;我们先回顾下 MySQL 的权限列表。权限列表大体分为服务级别和表级别&#xff0c;列级别以32313133353236313431303231363533e59b9ee7ad9431333433633464及大而广的角色(也是MySQL 8.0 新增)存储程序等权限。我们看到有一个特殊的 SU…

注释嵌套注释_注释,无处不在的注释

注释嵌套注释十年前的2004年 &#xff0c; Java 1.5开始提供注释。 很难想象没有此功能的代码。 实际上&#xff0c;首先引入了注释&#xff0c;以减轻开发人员编写繁琐的样板代码的痛苦&#xff0c;并使代码更具可读性。 考虑一下J2EE 1.4&#xff08;没有可用的注释&#xff…

a标签跳到另一个页面指定选项卡_HTML常用标签

本篇文章主要是对a、img和table标签用法介绍&#xff1a;a标签&#xff1a;可称为锚元素&#xff0c;主要功能是创建通向其他网页、文件、同一页面的其他位置、电子邮件地址或其他任何url地址的超链接&#xff1b;1.img标签&#xff1a;发出get请求并显示返回的图片1.常用属性&…

c语言也能用模板方法模式?

模式动机在嵌入式的应用场景中&#xff0c;管理资源(例如文件、内存)是一件非常麻烦、非常容易出错的事情。因为在分配资源后&#xff0c;还必须释放资源。例如fopen()打开文件后&#xff0c;必须要使用fclose()来关闭文件&#xff0c;而使用malloc申请内存资源后&#xff0c;就…

cv2 imshow窗口大小_cv2.imshow()图片无法显示

在Pycharm和jupyter notebook中运行cv2.imshow()函数的时候&#xff0c;图片无法正常显示&#xff0c;是因为在运行cv2.imshow()之后&#xff0c;需要使用cv2.waitKey()来保持窗口的显示&#xff0c;用cv2.destroyAllWindows()来关闭窗口。cv2.imshow()后面需要跟随着cv2.waitK…

游戏 服务器 微服务_整体服务器与微服务

游戏 服务器 微服务介绍 刚开始时&#xff0c;由于要求简单&#xff0c;所以应用程序既简单又小。 随着时间的要求和需求的增长&#xff0c;我们的应用程序变得越来越大&#xff0c;越来越复杂。 这就导致了将单片服务器开发和部署为一个单元。 在某种程度上&#xff0c;微服务…

数据与ELF数据节-计算机系统基础题目

实验内容&#xff1a;修改二进制可重定位目标文件“phase1.o”的数据&#xff08;.data&#xff09;节内容&#xff08;不允许修改其他节&#xff09;&#xff0c;使其与main.o模块如下链接后运行时输出目标字符串“123456789”。 实验步骤&#xff1a; 1. 使用objdump工具获得…

sqlserver拼接sql插入table_10个SQL技巧

介 绍为了理解这 10 个 SQL 技巧的价值&#xff0c;首先需要了解下 SQL 语言的上下文。为什么我要在 Java 会议上讨论 SQL 呢&#xff1f;(我可能是唯一一个在 Java 会议上讨论 SQL 的了)下面讲下为什么&#xff1a;从早期开始&#xff0c;编程语言设计者就有这种的愿望&#x…

【C语言笔记】指定初始化器

C99增加了一个新特性&#xff1a;指定初始化器(designated initializer)。利用该特性可以初始化指定的数组元素&#xff0c;也可以初始化指定的结构体变量。本文主要分享&#xff1a;使用指定初始化器初始化数组。例如&#xff0c;只初始化数组中的最后一个元素。对于传统的C初…

本地虚拟机上的docker安装mysql_Linux虚拟机上安装docker,并使用docker安装mysql,tomcat...

1、序言现在在Linux虚拟机上安装程序&#xff0c;越来越多的人都使用docker完成&#xff0c;本次就记录下在虚拟机上安装docker的过程。如果你的windows系统上还没有安装Linux虚拟机&#xff0c;请参考我的上一篇博客&#xff1a;安装Linux虚拟机2、docker简介Docker是一个开源…

java锁性能对比_提高Java的锁性能

java锁性能对比Plumbr是唯一可以通过解释应用程序性能数据来自动检测Java性能问题根本原因的解决方案。 几个月前&#xff0c;我们在Plumbr中引入了锁定线程检测之后&#xff0c;我们开始收到类似于“嘿&#xff0c;太好了&#xff0c;现在我知道是什么导致了性能问题&#xf…