Java でファイルを圧縮

Sheeraz Gul 2024年2月15日
  1. Java.Util.Zip を使用して Java で単一のファイルを圧縮する
  2. Java.Util.Zip を使用して Java で複数のファイルを圧縮する
  3. Java.Util.Zip を使用して Java でフォルダーを圧縮する
Java でファイルを圧縮

zip ファイルは、単一のファイル、複数のファイル、またはフォルダーで構成できます。 zip ファイルを作成するには、さまざまな方法があります。

このチュートリアルでは、Java で zip ファイルを作成するさまざまな例を示します。

Java.Util.Zip を使用して Java で単一のファイルを圧縮する

java.util.zip.ZipOutputStream クラスを使用して、Java で単一のファイルを圧縮できます。 以下の例を参照してください。

package delftstack;

import java.io.*;
import java.nio.file.Files;
import java.nio.file.Path;
import java.nio.file.Paths;
import java.util.zip.ZipEntry;
import java.util.zip.ZipOutputStream;

public class Create_Zip {
  public static void main(String[] args) {
    Path Source_File =
        Paths.get("C:\\Users\\Sheeraz\\OneDrive\\Desktop\\ZipFiles\\delftstack1.txt");
    String Output_Zip = "C:\\Users\\Sheeraz\\OneDrive\\Desktop\\ZipFiles\\NewZip.zip";

    try {
      Create_Zip.Create_Zip_File(Source_File, Output_Zip);
      System.out.println("Zip File Created");
    } catch (IOException e) {
      e.printStackTrace();
    }
  }

  // method to zip a single file
  public static void Create_Zip_File(Path Source_File, String Output_Zip) throws IOException {
    if (!Files.isRegularFile(Source_File)) {
      System.err.println("File Not Found.");
      return;
    }

    try (ZipOutputStream Zip_Output_Stream = new ZipOutputStream(new FileOutputStream(Output_Zip));
         FileInputStream File_Input_Stream = new FileInputStream(Source_File.toFile());) {
      ZipEntry Zip_Entry = new ZipEntry(Source_File.getFileName().toString());
      Zip_Output_Stream.putNextEntry(Zip_Entry);

      byte[] Buffer = new byte[1024];
      int Length;
      while ((Length = File_Input_Stream.read(Buffer)) > 0) {
        Zip_Output_Stream.write(Buffer, 0, Length);
      }
      Zip_Output_Stream.closeEntry();
    }
  }
}

上記のコードは、単一ファイル delftstack1 のみを含む zip ファイルを作成します。

出力:

Zip File Created

単一ファイル

Java.Util.Zip を使用して Java で複数のファイルを圧縮する

同様に、java.util.zip.ZipOutputStream を使用して複数のファイルを zip ファイルに追加できます。 複数のファイルが 1つずつ zip ファイルに追加されます。

次の例を参照してください。

package delftstack;

import java.io.BufferedInputStream;
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 Create_Zip {
  public static void main(String[] args) {
    try {
      // The Source file paths
      String Source_File1 = "C:\\Users\\Sheeraz\\OneDrive\\Desktop\\ZipFiles\\delftstack1.txt";
      String Source_File2 = "C:\\Users\\Sheeraz\\OneDrive\\Desktop\\ZipFiles\\\\delftstack2.txt";
      // Output Zipped file path
      String Output_Zip_Path = "C:\\Users\\Sheeraz\\OneDrive\\Desktop\\ZipFiles\\NewZip.zip";

      File Output_Zip = new File(Output_Zip_Path);
      FileOutputStream File_Output_Stream = new FileOutputStream(Output_Zip);
      ZipOutputStream Zip_Output_Stream = new ZipOutputStream(File_Output_Stream);

      Create_Zip_File(Source_File1, Zip_Output_Stream);
      Create_Zip_File(Source_File2, Zip_Output_Stream);
      Zip_Output_Stream.close();
      System.out.println("Zip File Created");
    } catch (IOException e) {
      e.printStackTrace();
    }
  }
  // Method to create the zip file
  private static void Create_Zip_File(String Source_File, ZipOutputStream Zip_Output_Stream)
      throws IOException {
    final int BUFFER = 1024;
    BufferedInputStream Buffered_Input_Stream = null;
    try {
      File file = new File(Source_File);
      FileInputStream File_Input_Stream = new FileInputStream(file);
      Buffered_Input_Stream = new BufferedInputStream(File_Input_Stream, BUFFER);

      ZipEntry Zip_Entry = new ZipEntry(file.getName());
      Zip_Output_Stream.putNextEntry(Zip_Entry);
      byte Data[] = new byte[BUFFER];
      int Length;
      while ((Length = Buffered_Input_Stream.read(Data, 0, BUFFER)) != -1) {
        Zip_Output_Stream.write(Data, 0, Length);
      }
      // close the entry
      Zip_Output_Stream.closeEntry();
    } finally {
      try {
        Buffered_Input_Stream.close();
      } catch (IOException e) {
        e.printStackTrace();
      }
    }
  }
}

上記のコードは、複数のファイルを zip ファイルに追加します。

出力:

Zip File Created

複数ファイル

Java.Util.Zip を使用して Java でフォルダーを圧縮する

Java.Util.Zip は、すべてのサブフォルダーとファイルを含むフォルダーまたはディレクトリを圧縮することもできます。 以下の例を参照してください。

package delftstack;

import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.IOException;
import java.nio.file.*;
import java.nio.file.attribute.BasicFileAttributes;
import java.util.zip.ZipEntry;
import java.util.zip.ZipOutputStream;

public class Create_Zip {
  public static void main(String[] args) {
    Path Source_Folder = Paths.get("C:\\Users\\Sheeraz\\OneDrive\\Desktop\\ZipFiles\\Folder");

    if (!Files.isDirectory(Source_Folder)) {
      System.out.println("Please provide the right folder.");
      return;
    }

    try {
      Create_Zip.Create_Zip_Folder(Source_Folder);
      System.out.println("Folder is zipped");
    } catch (IOException e) {
      e.printStackTrace();
    }
  }

  // zip a directory or folder
  public static void Create_Zip_Folder(Path Source_Folder) throws IOException {
    // get folder name as zip file name
    String Output_Zip = Source_Folder.getFileName().toString() + ".zip";

    try (
        ZipOutputStream Zip_Output_Stream = new ZipOutputStream(new FileOutputStream(Output_Zip))) {
      Files.walkFileTree(Source_Folder, new SimpleFileVisitor<>() {
        @Override
        public FileVisitResult visitFile(Path File, BasicFileAttributes File_Attributes) {
          // only copy files
          if (File_Attributes.isSymbolicLink()) {
            return FileVisitResult.CONTINUE;
          }

          try (FileInputStream File_Input_Stream = new FileInputStream(File.toFile())) {
            Path targetFile = Source_Folder.relativize(File);
            Zip_Output_Stream.putNextEntry(new ZipEntry(targetFile.toString()));

            byte[] BUFFER = new byte[1024];
            int Length;
            while ((Length = File_Input_Stream.read(BUFFER)) > 0) {
              Zip_Output_Stream.write(BUFFER, 0, Length);
            }

            Zip_Output_Stream.closeEntry();

            System.out.printf("Zipped file : %s%n", File);

          } catch (IOException e) {
            e.printStackTrace();
          }
          return FileVisitResult.CONTINUE;
        }

        @Override
        public FileVisitResult visitFileFailed(Path File, IOException exception) {
          System.err.printf("Unable to zip the file : %s%n%s%n", File, exception);
          return FileVisitResult.CONTINUE;
        }
      });
    }
  }
}

上記のコードは、指定されたフォルダーを圧縮します。

出力:

Zipped file : C:\Users\Sheeraz\OneDrive\Desktop\ZipFiles\Folder\delftstack1.txt
Zipped file : C:\Users\Sheeraz\OneDrive\Desktop\ZipFiles\Folder\delftstack2.txt
Folder is zipped

Zip フォルダー

ファイル システムや zip4j など、ファイルやフォルダーを圧縮できる他の方法もあります。 ただし、Java.Util.Zip は、ファイルとフォルダーを圧縮する最も効率的な方法と考えられています。

著者: Sheeraz Gul
Sheeraz Gul avatar Sheeraz Gul avatar

Sheeraz is a Doctorate fellow in Computer Science at Northwestern Polytechnical University, Xian, China. He has 7 years of Software Development experience in AI, Web, Database, and Desktop technologies. He writes tutorials in Java, PHP, Python, GoLang, R, etc., to help beginners learn the field of Computer Science.

LinkedIn Facebook

関連記事 - Java File