📜  Java中文件的压缩和解压

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

Java中文件的压缩和解压

Java中提供了 DeflaterOutputStream 和 InflaterInputStream 类来压缩和解压缩文件内容。这些类提供了可用于压缩文件内容的有用方法。

使用 DeflaterOutputStream 压缩文件

此类实现了一个输出流过滤器,用于以“deflate”压缩格式压缩数据。它还用作其他类型的压缩过滤器的基础,例如 GZIPOutputStream。

重要方法:

  • void close() :将剩余的压缩数据写入输出流并关闭底层流。
  • protected void deflate() :将下一个压缩数据块写入输出流。
  • void finish() :在不关闭底层流的情况下完成将压缩数据写入输出流。
  • void flush() :刷新压缩的输出流。
  • void write(byte[] b, int off, int len) :将字节数组写入压缩输出流,其中 off 是数据的起始偏移量,len 是总字节数。
  • void write(int b) :将一个字节写入压缩输出流。

压缩文件的步骤(文件 1)

  • 将输入文件“文件 1”带到 FileInputStream 以读取数据。
  • 获取输出文件“文件 2”并将其分配给 FileOutputStream 。这将有助于将数据写入“file2”。
  • 将 FileOutputStream 分配给 DeflaterOutputStream 以压缩数据。
  • 现在,从 FileInputStream 读取数据并将其写入 DeflaterOutputStream。它将压缩数据并将其发送到 FileOutputStream,后者将压缩数据存储到输出文件中。
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;
import java.util.zip.Deflater;
import java.util.zip.DeflaterOutputStream;
  
class zip
{
    public static void main(String[] args) throws IOException {
        //Assign the original file : file to
        //FileInputStream for reading data
        FileInputStream fis=new FileInputStream("file1");
  
        //Assign compressed file:file2 to FileOutputStream
        FileOutputStream fos=new FileOutputStream("file2");
  
        //Assign FileOutputStream to DeflaterOutputStream
        DeflaterOutputStream dos=new DeflaterOutputStream(fos);
  
        //read data from FileInputStream and write it into DeflaterOutputStream
        int data;
        while ((data=fis.read())!=-1)
        {
            dos.write(data);
        }
  
        //close the file
        fis.close();
        dos.close();
    }
}

使用 InflaterInputStream 解压文件

此类实现了一个流过滤器,用于以“deflate”压缩格式解压缩数据。它也被用作其他解压过滤器的基础,例如 GZIPInputStream。

重要方法:

  • int available() :到达 EOF 后返回 0,否则总是返回 1。
  • void close() :关闭输入流并释放与该流关联的所有系统资源。
  • protected void fill() :用更多要解压缩的数据填充输入缓冲区。
  • void mark(int readlimit) :标记输入流中的当前位置。
  • boolean markSupported() :测试输入流是否支持 mark 和 reset 方法。
  • int read() :读取一个字节的未压缩数据。
  • int read(byte[] b, int off, int len) :将解压后的数据读入到压缩输出流的字节数组中,其中 off 是数据的起始偏移量,len 是总字节数。
  • void reset() :将此流重新定位到最后一次在此输入流上调用标记方法时的位置。

解压文件的步骤

  • 名称为“file2”的文件现在包含压缩数据,我们需要从该文件中获取原始解压缩数据。
  • 将压缩文件“file2”分配给 FileInputStream。这有助于从“file2”中读取数据。
  • 将输出文件“file3”分配给 FileOutputStream。这将有助于将未压缩的数据写入“file3”。
  • 现在,从 InflaterInputStream 读取未压缩的数据并将其写入 FileOutputStream。这会将未压缩的数据写入“file3”。
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.IOException;
import java.util.zip.InflaterInputStream;
  
//Uncompressing a file using an InflaterInputStream
class unzip
{
    public static void main(String[] args) throws IOException {
        //assign Input File : file2 to FileInputStream for reading data
        FileInputStream fis=new FileInputStream("file2");
  
        //assign output file: file3 to FileOutputStream for reading the data
        FileOutputStream fos=new FileOutputStream("file3");
          
        //assign inflaterInputStream to FileInputStream for uncompressing the data
        InflaterInputStream iis=new InflaterInputStream(fis);
          
        //read data from inflaterInputStream and write it into FileOutputStream 
        int data;
        while((data=iis.read())!=-1)
        {
            fos.write(data);
        }
          
        //close the files
        fos.close();
        iis.close();
          
    }
}