如何从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):创建一个具有指定缓冲区大小的新输入流。
Note: The java.util.zip.GZIPInputStream.read(byte[] buf, int off, int len) method reads uncompressed data into an array of bytes. If len is not zero, the method will block until some input can be decompressed; otherwise, no bytes are read and 0 is returned.
这个类的方法是 如下:
方法一: 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