Java 中的檔案壓縮和解壓縮


讀取特定檔案的資料並壓縮一些檔案到zip壓縮包中,是 Java 中封裝的過程。Java 環境中提供了兩個壓縮和解壓縮類,它們提供資料deflate壓縮格式。它們是:

  • DeflaterOutputStream 類 - 用於將檔案壓縮成deflate格式,例如 GZIPOutputStream。

  • InflaterInputStream 類 - 用於以deflate格式解壓縮檔案,例如 GZIPInputStream。

示例

這是一個關於如何在 Java 中將檔案壓縮成 Zip 檔案的示例:

try {
	File file = new File(filePath);
	String zipFileName = file.getName().concat(".zip");
	FileOutputStream fos = new FileOutputStream(zipFileName);
	ZipOutputStream zos = new ZipOutputStream(fos);
	zos.putNextEntry(new ZipEntry(file.getName()));
	byte[] bytes = Files.readAllBytes(Paths.get(filePath));
	zos.write(bytes, 0, bytes.length);
	zos.closeEntry();
	zos.close();
} catch (FileNotFoundException ex) {
   System.err.format("The file %s does not exist", filePath);
} catch (IOException ex) {
   System.err.println("I/O error: " + ex);
}

在 Java 中執行檔案壓縮和解壓縮的演算法

在這個可能的演算法中,我們將向您展示如何使用 Java 環境執行壓縮和解壓縮過程以獲得所需結果。

  • 步驟 1 - 開始該過程。

  • 步驟 2 - 宣告並匯入 Java 包以執行壓縮和解壓縮過程。

  • 步驟 3 - 宣告一個公共類。

  • 步驟 4 - 宣告一個字串引數。

  • 步驟 5 - 分配原始檔案,這可能會丟擲異常。

  • 步驟 6 - 宣告一個 FileInputStream 以執行讀取資料操作。

  • 步驟 7 - 分配第二個壓縮檔案。

  • 步驟 8 - 宣告一個 FileOutputStream 以執行讀取資料操作。

  • 步驟 9 - 從 FileInputStream 讀取資料。

  • 步驟 10 - 將資料寫入 DeflaterOutputStream。

  • 步驟 11 - 獲取壓縮和解壓縮檔案作為輸出。

  • 步驟 12 - 關閉檔案。

  • 步驟 13 - 獲取返回值。

  • 步驟 14 - 終止該過程。

Java 中檔案壓縮和解壓縮的語法

public class CompressingFiles {
public static void main(String args[]) throws IOException {
   String inputPath = "Declare The File Path Input";
   FileInputStream inputStream = new FileInputStream(inputPath);
   String outputPath = "Declare The File Path Output";
   FileOutputStream outputStream = new FileOutputStream(outputPath);
   DeflaterOutputStream compresser = new DeflaterOutputStream(outputStream);
   int contents;
   while ((contents=inputStream.read())!=-1){
      compresser.write(contents);
   }
   compresser.close();
   System.out.println("File compressed Today.....");
}
public class DeCompressingFiles {
   public static void main(String args[]) throws IOException {
      StringinputPath ="Declare The File Path Input";
      FileInputStream inputStream = new FileInputStream(inputPath);
      String outputpath = "Declare The File Path Output";
      FileOutputStream outputStream = new FileOutputStream(outputpath);
      InflaterInputStream decompresser = new InflaterInputStream(inputStream);
      int contents;
      while ((contents=decompresser.read())!=-1){
         outputStream.write(contents);
      }
      outputStream.close();
      decompresser.close();
      System.out.println("File un-compressed today");
   }
}

在上述可能的語法中,我們嘗試向您展示如何宣告和建立壓縮和解壓縮類,並最終獲得 zip 檔案。透過使用這些特定的語法,我們正在朝著可能的 Java 方法前進,以有效地解決問題陳述。

遵循的方法

  • 方法 1 - 使用 DeflaterOutputStream 壓縮檔案並使用 InflaterInputStream 解壓縮檔案的 Java 程式

  • 方法 2 - Java 程式在單個檔案和多個檔案上執行壓縮和解壓縮操作

方法 1:使用 DeflaterOutputStream 壓縮檔案並使用 InflaterInputStream 解壓縮檔案

使用 DeflaterOutputStream 方法壓縮檔案

在這種可能的方法中,我們將應用 DeflaterOutputStream,它能夠將檔案壓縮成 deflate 格式。

DeflaterOutputStream dos=new DeflaterOutputStream(fos);
InflaterInputStream iis=new InflaterInputStream(fis)

示例

//Java program to crompress some files by using java.util.zip.DeflaterOutputStream
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;
public class zipoperation{
   public static void main(String[] args) throws IOException {
      FileInputStream fis=new FileInputStream("File 1 ARBRDD");
      FileOutputStream fos=new FileOutputStream("File 2 ARBRDD");
      DeflaterOutputStream dos=new DeflaterOutputStream(fos);
      int data;
      while ((data=fis.read())!=-1){
         dos.write(data);
      }
      fis.close();
      dos.close();
   }
}
Exception in thread "main" java.io.FileNotFoundException: File 1 ARBRDD (No such file or directory)
   at java.base/java.io.FileInputStream.open0(Native Method)
   at java.base/java.io.FileInputStream.open(FileInputStream.java:219)
   at java.base/java.io.FileInputStream.<init>(FileInputStream.java:158)
   at java.base/java.io.FileInputStream.<init>(FileInputStream.java:112)
   at zipoperation.main(zipoperation.java:10)

使用 InflaterInputStream 方法解壓縮檔案

在這種可能的方法中,我們將應用 InflaterInputStream,它能夠將檔案解壓縮成 deflate 格式。

示例

//Java program to crompress some files by using java.util.zip.InflaterInputStream
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.IOException;
import java.util.zip.InflaterInputStream;
public class unzipARBRDD{
   public static void main(String[] args) throws IOException {
      FileInputStream fis=new FileInputStream("File 2 ARBRDD");
      FileOutputStream fos=new FileOutputStream("File 3 ARBRDD");
      InflaterInputStream iis=new InflaterInputStream(fis);
      int data;
      while((data=iis.read())!=-1){
         fos.write(data);
      }
      fos.close();
      iis.close();
   }
}

輸出

Exception in thread "main" java.io.FileNotFoundException: File 2 ARBRDD (No such file or directory)
   at java.base/java.io.FileInputStream.open0(Native Method)
   at java.base/java.io.FileInputStream.open(FileInputStream.java:219)
   at java.base/java.io.FileInputStream.<init>(FileInputStream.java:158)
   at java.base/java.io.FileInputStream.<init>(FileInputStream.java:112)
   at unzipARBRDD.main(unzipARBRDD.java:9)

免責宣告 - 在上面提到的每個 Java 程式碼中,使用者在執行此程式碼時都會遇到異常。提到的異常僅針對檔案路徑,這是每個使用者及其系統的唯一語句。

方法 2:在單個檔案和多個檔案上執行壓縮和解壓縮操作

使用各種流方法

在這種可能的方法中,我們將應用 Java 環境中存在的輸入輸出流,應用於多個檔案以及目錄檔案。執行這些 Java 方法後,我們將以 Zip 檔案的形式獲得所需的輸出。

FileInputStream fin=new FileInputStream("File Name.java");
FileOutputStream fout=new FileOutputStream("Compressed File.txt");

示例 1

//Java Program to compress a single file with input output stream
import java.io.File;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.IOException;
import java.util.zip.ZipEntry;
import java.util.zip.ZipOutputStream;
public class ZippingAFileExample {
   public static void main(String[] args) throws IOException {
      String sourceFile = "src-file.txt";
      FileOutputStream fos = new FileOutputStream("compressed.zip");
      System.out.println("File compression started.");
      ZipOutputStream zipOut = new ZipOutputStream(fos);
      File fileToZip = new File(sourceFile);
      FileInputStream fis = new FileInputStream(fileToZip);
      ZipEntry zipEntry = new ZipEntry(fileToZip.getName());
      zipOut.putNextEntry(zipEntry);
      byte[] bytes = new byte[1024];
      int length;
      while ((length = fis.read(bytes)) >= 0) {
         zipOut.write(bytes, 0, length);
      }
      zipOut.close();
      fis.close();
      fos.close();
      System.out.println("Done");
   }
}

輸出

File compression started.
Exception in thread "main" java.io.FileNotFoundException: src-file.txt (No such file or directory)
   at java.base/java.io.FileInputStream.open0(Native Method)
   at java.base/java.io.FileInputStream.open(FileInputStream.java:219)
   at java.base/java.io.FileInputStream.<init>(FileInputStream.java:158)
   at ZippingAFileExample.main(ZippingAFileExample.java:15)

示例 2

//Java Program to compress a multiple files at a time in Single Program
import java.io.File;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.IOException;
import java.util.Arrays;
import java.util.List;
import java.util.zip.ZipEntry;
import java.util.zip.ZipOutputStream;
public class ARBRDD{
   public static void main(String[] args) throws IOException {
      List<String> srcFiles = Arrays.asList("file-1.txt", "file-2.txt", "file- 3.txt");
      FileOutputStream fos = new FileOutputStream("multifilesCompressed.zip");
      System.out.println("Zipping started.");
      ZipOutputStream zipOut = new ZipOutputStream(fos);
      for (String srcFile : srcFiles) {
         File fileToZip = new File(srcFile);
         FileInputStream fis = new FileInputStream(fileToZip);
         ZipEntry zipEntry = new ZipEntry(fileToZip.getName());
         zipOut.putNextEntry(zipEntry);
         byte[] bytes = new byte[1024];
         int length;
         while ((length = fis.read(bytes)) >= 0) {
            zipOut.write(bytes, 0, length);
         }
         fis.close();
      }
      zipOut.close();
      fos.close();
      System.out.println("Done");
   }
}

輸出

Zipping started.
Exception in thread "main" java.io.FileNotFoundException: file-1.txt (No such file or directory)
   at java.base/java.io.FileInputStream.open0(Native Method)
   at java.base/java.io.FileInputStream.open(FileInputStream.java:219)
   at java.base/java.io.FileInputStream.<init>(FileInputStream.java:158)
   at ARBRDD.main(ARBRDD.java:18)

示例 3

//Java Program to compress a directory at a time
import java.io.File;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.IOException;
import java.util.zip.ZipEntry;
import java.util.zip.ZipOutputStream;
public class ARBRDD {
   public static void main(String[] args) throws IOException {
      String sourceFile = "src";
      FileOutputStream fos = new FileOutputStream("DirSrcCompressed.zip");
      ZipOutputStream zipOut = new ZipOutputStream(fos);
      File fileToZip = new File(sourceFile);
      zipFile(fileToZip, fileToZip.getName(), zipOut);
      zipOut.close();
      fos.close();
   }
   private static void zipFile(File fileToZip, String fileName, ZipOutputStream
   zipOut) throws IOException {
      if (fileToZip.isHidden()) {
         return;
      }
      if (fileToZip.isDirectory()) {
         if (fileName.endsWith("/")) {
            zipOut.putNextEntry(new ZipEntry(fileName));
            zipOut.closeEntry();
         } else {
            zipOut.putNextEntry(new ZipEntry(fileName + "/"));
            zipOut.closeEntry();
         }
         File[] children = fileToZip.listFiles();
         for (File childFile : children) {
            zipFile(childFile, fileName + "/" + childFile.getName(), zipOut);
         }
         return;
      }
      FileInputStream fis = new FileInputStream(fileToZip);
      ZipEntry zipEntry = new ZipEntry(fileName);
      zipOut.putNextEntry(zipEntry);
      byte[] bytes = new byte[1024];
      int length;
      while ((length = fis.read(bytes)) >= 0) {
         zipOut.write(bytes, 0, length);
      }
      fis.close();
   }
}

輸出

Exception in thread "main" java.io.FileNotFoundException: src (No such file or directory)
   at java.base/java.io.FileInputStream.open0(Native Method)
   at java.base/java.io.FileInputStream.open(FileInputStream.java:219)
   at java.base/java.io.FileInputStream.<init>(FileInputStream.java:158)
   at ARBRDD.zipFile(ARBRDD.java:37)
   at ARBRDD.main(ARBRDD.java:14)

示例 4

//Java Program to unzip a compressed .zip file
import java.io.File;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.IOException;
import java.util.zip.ZipEntry;
import java.util.zip.ZipInputStream;
public class UnzipFileARBRDD {
   public static void main(String[] args) {
      String zipFilePath = "multifilesCompressed.zip";
      unzip(zipFilePath);
   }
   private static void unzip(String zipFilePath) {
      File dir = new File(".");
      if (!dir.exists())
      dir.mkdirs();
      FileInputStream fis;
      byte[] buffer = new byte[1024];
      try {
         fis = new FileInputStream(zipFilePath);
         ZipInputStream zis = new ZipInputStream(fis);
         ZipEntry ze = zis.getNextEntry();
         while (ze != null) {
            String fileName = ze.getName();
            File newFile = new File("." + File.separator + fileName);
            System.out.println("Unzipping to " + newFile.getAbsolutePath());
            new File(newFile.getParent()).mkdirs();
            FileOutputStream fos = new FileOutputStream(newFile);
            int len;
            while ((len = zis.read(buffer)) > 0) {
               fos.write(buffer, 0, len);
            }
            fos.close();
            zis.closeEntry();
            ze = zis.getNextEntry();
         }
         zis.closeEntry();
         zis.close();
         fis.close();
      } catch (IOException e) {
         e.printStackTrace();
      }
   }
}

輸出

java.io.FileNotFoundException: multifilesCompressed.zip (No such file or directory)
at java.base/java.io.FileInputStream.open0(Native Method)
at java.base/java.io.FileInputStream.open(FileInputStream.java:219)
	at java.base/java.io.FileInputStream.<init>(FileInputStream.java:158)
at java.base/java.io.FileInputStream.<init>(FileInputStream.java:112)
at UnzipFileARBRDD.unzip(UnzipFileARBRDD.java:20)
	at UnzipFileARBRDD.main(UnzipFileARBRDD.java:11)

免責宣告 - 在上面提到的每個 Java 程式碼中,使用者在執行此程式碼時都會遇到異常。提到的異常僅針對檔案路徑,這是每個使用者及其系統的唯一語句。

結論

在 Java 環境中,引入了 DeflaterOutputStream 和 InflaterInputStream 類來壓縮和解壓縮檔案內容,它們提供了可用於將檔案內容壓縮到 ZIP 檔案中的有用方法。在本文中,我們學習瞭如何使用 Java 函式執行壓縮操作。透過上面提到的語法和 Java 方法以及演算法,我們嘗試以有效的方式解決問題陳述。

另請參閱: Java 面試問題及答案

更新於: 2024年6月17日

594 次檢視

開啟您的 職業生涯

透過完成課程獲得認證

開始學習
廣告
© . All rights reserved.