HOWTO · Java

Java でファイルを圧縮

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

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 は、ファイルとフォルダーを圧縮する最も効率的な方法と考えられています。