gzip压缩数据变大_使用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 String
                String 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压缩数据变大

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: 单片机gzip数据压缩是指利用单片机实现gzip算法对数据进行压缩,从而减小数据的占用空间,节省存储空间。gzip算法是一种常用的数据压缩算法,能够在保持数据准确性的同时,将数据压缩至原始数据的1/3左右,是一种广泛应用于文件压缩数据传输领域的压缩算法。 要实现单片机gzip数据压缩,需先将需要压缩数据传输到单片机中,再进行压缩操作。压缩完成后,将压缩后的数据存储到指定存储空间中,以便于再次使用或传输至其他设备。 在实现单片机gzip数据压缩的过程中,需注意单片机内存和算法的适配性。gzip算法的实现需要一定的计算能力和存储空间,因此,需选择适合的单片机芯片及其存储器容量才能完成较为复杂的压缩任务。同时,需保证算法的正确性和稳定性,避免出现数据丢失或压缩错误的情况。 总之,单片机gzip数据压缩是一项有挑战性的任务,需要根据实际需求,选择适合的算法和单片机芯片,并进行合理的算法优化和调试,以实现高效、稳定和准确的数据压缩。 ### 回答2: 单片机gzip数据压缩是一种将数据压缩gzip格式来节省内存空间的技术。gzip是UNIX系统中常用的压缩技术,其压缩算法可以在单片机上进行实现。这种技术的实现需要使用特定的压缩库,例如zlib压缩库。在将数据压缩gzip格式之前,需要先将数据分割成小块,以便单片机的内存可以容纳并操作它们。然后通过zlib压缩库实现数据压缩,并将压缩后的数据保存在单片机的存储器中。在需要使用压缩数据的时候,可以通过解压缩算法将数据还原成原始格式,然后进行处理。 单片机gzip数据压缩技术可以在资源受限的嵌入式系统中实现对数据压缩和解压缩,从而节省内存空间和减少通信时间。例如在物联网设备中,压缩传感器数据可以降低数据传输的带宽和功耗。此外,此技术也可以应用于嵌入式设备固件更新、音频和视频编码等方面。 总之,单片机gzip数据压缩是一种有效的技术,可以帮助嵌入式设备实现节省内存空间和通信时间的目的,在物联网等领域具有广泛的应用前景。 ### 回答3: 单片机gzip数据压缩是一种在嵌入式系统中压缩数据的方法。gzip是一种流式压缩算法,它可以利用很少的内存和处理器资源来实现高效的数据压缩,并且可以在不同的平台上进行交换。对于单片机系统来说,gzip压缩算法通常使用zlib库实现。Zlib是一个轻量级的压缩库,包含多种压缩算法,其中包括gzip算法。 在单片机中使用gzip压缩数据可以有效地减小存储空间和传输带宽。单片机系统的内存和存储资源通常很有限,所以gzip压缩算法可以提供更高效的数据存储和传输方式。同时,它还可以减少通信时间和电力消耗。 在实际应用中,需要注意使用gzip压缩算法会增加压缩和解压缩的计算复杂度,这可能会降低系统的响应速度。因此,在选择是否使用gzip压缩算法时,需要综合考虑系统的处理能力和计算资源。 总之,单片机gzip数据压缩是一种高效的数据压缩方法,适合于内存和存储资源有限,需要进行高效数据传输的嵌入式系统中使用

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值