📜  如何从Java中的 GZIPInputStream 读取数据?

📅  最后修改于: 2022-05-13 01:55:44.014000             🧑  作者: Mango

如何从Java中的 GZIPInputStream 读取数据?

Java GZIPInputStream 类 (Java.util.zip.GZIPInputStream ) 可用于解压缩使用 GZIP 压缩算法压缩的文件,例如通过 GZIPOutputStream 类。

java.lang.Object
    java.io.InputStream
        java.io.FilterInputStream
            java.util.zip.InflaterInputStream
                java.util.zip.GZIPInputStream

所有实现的接口:

可关闭,可自动关闭

public class GZIPInputStream
extends InflaterInputStream

此类实现了一个流过滤器,用于读取 GZIP 文件格式的压缩数据。

该类的构造函数如下:

  • GZIPInputStream(InputStream in):创建一个具有默认缓冲区大小的新输入流。
  • GZIPInputStream(InputStream in, int size):创建一个具有指定缓冲区大小的新输入流。

这个类的方法是 如下

方法一: close()

关闭此输入流并释放与该流关联的所有系统资源

返回类型:

方法二: read()

将未压缩的数据读入字节数组

参数:

  • 字节数组
  • 中断
  • 整数长度

返回类型:整数

现在让我们来看看下面列出的古怪方法:

方法三: GZIPInputStream.read(byte[] buf, int off, int len) 方法。

参数:

  • 字节[] buf
  • 中断
  • 内线

句法:

public int read()
throws IOException

参数

  • 读取数据的缓冲区。
  • 目标数组中的起始偏移量 b.
  • 读取的最大字节数。

返回类型:读取的实际字节数,如果到达流的末尾,则为 -1。

抛出的异常:

  • NullPointerException - 如果 buf(缓冲区)为空。
  • IndexOutOfBoundsException - 如果 off 为负,len 为负,或者 len 大于 buf.length – off。
  • ZipException - 如果压缩的输入数据已损坏。
  • IOException - 如果发生 I/O 错误。

例子

Java
// Java Program to Usage of GZIPInputStream
// via Showcasing Reading Data 
  
// Importing requireed classes
import java.io.ByteArrayInputStream;
import java.io.ByteArrayOutputStream;
import java.io.IOException;
import java.util.Arrays;
import java.util.zip.DataFormatException;
import java.util.zip.GZIPInputStream;
import java.util.zip.GZIPOutputStream;
  
// Main class
// GZIPInputStreamDemo
public class GFG {
  
    // Main driver method 
    public static void main(String[] args)
        throws DataFormatException, IOException
    {
        // Custom input string   
        String message = "Welcome to Geeksforgeeks;"
                         + "Welcome to Geeksforgeeks;"
                         + "Welcome to Geeksforgeeks;"
                         + "Welcome to Geeksforgeeks;"
                         + "Welcome to Geeksforgeeks;"
                         + "Welcome to Geeksforgeeks;"
                         + "Welcome to Geeksforgeeks;"
                         + "Welcome to Geeksforgeeks;"
                         + "Welcome to Geeksforgeeks;"
                         + "Welcome to Geeksforgeeks;";
  
        // Print and display the message
        System.out.println("Original Message length : "
                           + message.length());
        
        byte[] input = message.getBytes("UTF-8");
  
        // Compress the bytes
        ByteArrayOutputStream arrayOutputStream
            = new ByteArrayOutputStream();
        GZIPOutputStream outputStream
            = new GZIPOutputStream(arrayOutputStream);
        outputStream.write(input);
        outputStream.close();
  
        // Read and decompress the data
        byte[] readBuffer = new byte[5000];
        ByteArrayInputStream arrayInputStream
            = new ByteArrayInputStream(
                arrayOutputStream.toByteArray());
        GZIPInputStream inputStream
            = new GZIPInputStream(arrayInputStream);
        int read = inputStream.read(readBuffer, 0,
                                    readBuffer.length);
        inputStream.close();
        // Should hold the original (reconstructed) data
        byte[] result = Arrays.copyOf(readBuffer, read);
  
        // Decode the bytes into a String
        message = new String(result, "UTF-8");
  
        System.out.println("UnCompressed Message length : "
                           + message.length());
    }
}


输出
Original Message length : 250
UnCompressed Message length : 250