ホームページ  >  記事  >  Java  >  JavaでZip関数を使用してファイルを圧縮する方法

JavaでZip関数を使用してファイルを圧縮する方法

PHPz
PHPzオリジナル
2023-06-26 14:10:191839ブラウズ

ファイルの圧縮は、ディスク容量とネットワーク送信時間を節約できる一般的な操作であり、Java にはファイル圧縮用の Zip 関数が用意されています。この記事では、Java で Zip 関数を使用してファイルを圧縮する方法を、詳細な紹介とデモ例を通して説明します。

1. Zip 関数の概要

Zip 関数は、Java で提供されている圧縮およびパッケージ化ツールのライブラリであり、この関数を使用すると、ファイルやフォルダーを Zip 形式のファイルに圧縮できます。 Zip 関数は主に、ZipOutputStream と ZipEntry という 2 つのクラスを使用します。ZipOutputStream は圧縮ファイルの出力を担当し、ZipEntry は圧縮ファイル内の別の実体です。これら 2 つのクラスの使用方法については、以下で詳しく紹介します。

2. ZipOutputStream クラス

ZipOutputStream クラスは Java の主要な圧縮クラスで、データを Zip 形式の出力ストリームに圧縮して、ファイルまたはネットワーク接続に書き込むことができます。 ZipOutputStream クラスの主なメソッドは次のとおりです。

  1. addEntry(ZipEntry エントリ): 圧縮ファイルに新しいエンティティを追加します。
  2. close(): 出力ストリームを閉じます。
  3. putNextEntry(ZipEntry エントリ): 圧縮ファイルへの新しいエンティティの書き込みを開始します。この関数は、各エンティティを書き込む前に呼び出す必要があります。
  4. write(byte[] buf, int offset, int len): 現在のエンティティにデータを書き込みます。

3. ZipEntry クラス

ZipEntry クラスは、圧縮ファイル内の単一のエンティティです。圧縮されたエンティティごとに、ZipEntry クラスのインスタンスを作成する必要があります。 ZipEntry クラスの主なメソッドは次のとおりです。

  1. getName(): 圧縮ファイル内のエンティティの名前を取得します。
  2. setSize(long size): エンティティのサイズを指定します。
  3. setTime(long time): 圧縮ファイル内のエンティティの変更時間を指定します。
  4. setTime(long time): 圧縮ファイル内のエンティティの作成時間を指定します。
  5. setMethod(int method): このエンティティで使用される圧縮方法を指定します。
  6. getSize(): エンティティのサイズを取得します。

4. デモの例

以下では、完全なデモを通じて、Java で Zip 関数を使用してファイルを圧縮する方法を示します。圧縮する必要があるフォルダー「/Users/Name/Desktop/File」があるとします。次の手順に従うことができます:

  1. まず、ZipOutputStream オブジェクトを作成し、出力ファイルの名前を指定します。 。

FileOutputStream fos = new FileOutputStream("Test.zip");
ZipOutputStream zipOut = new ZipOutputStream(fos);

  1. 必要なフォルダーをトラバースします。圧縮されている場合は、その中のファイルとフォルダーを取得します。

ファイル fileToZip = new File("/Users/Name/Desktop/File");
File[] files = fileToZip.listFiles();

  1. 取得したファイルとフォルダーをたどって、フォルダーとファイルを圧縮ファイルに 1 つずつ追加します。

for (File file : files) {

if (file.isDirectory()) {
    // 如果是文件夹,则需要递归遍历其中的所有文件和子文件夹
    zipSubFolder(zipOut, file, file.getParent().length());
} else {
    // 如果是文件,则将其添加到ZipOutputStream中
    addToZip(file, zipOut);
}

}

  1. サブフォルダーがある場合は、zipSubFolder 関数を再帰的に呼び出して走査する必要があります。

private static void zipSubFolder(ZipOutputStream zipOut, Filefolder, int BasePathLength) throws IOException {

File[] files = folder.listFiles();
for (File file : files) {
    if (file.isDirectory()) {
        // 递归遍历当前文件夹中的子文件夹
        zipSubFolder(zipOut, file, basePathLength);
    } else {
        // 将当前文件夹中的文件添加到ZipOutputStream中
        String relativePath = file.getAbsolutePath().substring(basePathLength);
        addToZip(file, zipOut, relativePath);
    }
}

}

  1. ファイルを ZipOutputStream に追加するメソッドは次のとおりです。下に示された。

private static void addToZip(File file, ZipOutputStream zipOut) throws IOException {

FileInputStream fis = new FileInputStream(file);
ZipEntry zipEntry = new ZipEntry(file.getName());
zipOut.putNextEntry(zipEntry);

byte[] bytes = new byte[1024];
int length;
while ((length = fis.read(bytes)) >= 0) {
    zipOut.write(bytes, 0, length);
}

zipOut.closeEntry();
fis.close();

}

  1. サブフォルダーがある場合は、それらを追加する必要があります相対パスが ZipEntry に追加されます。

private static void addToZip(File file, ZipOutputStream zipOut, StringrelativePath) throws IOException {

FileInputStream fis = new FileInputStream(file);
ZipEntry zipEntry = new ZipEntry(relativePath);
zipOut.putNextEntry(zipEntry);

byte[] bytes = new byte[1024];
int length;
while ((length = fis.read(bytes)) >= 0) {
    zipOut.write(bytes, 0, length);
}

zipOut.closeEntry();
fis.close();

}

  1. 最後に、 ZipOutputStream オブジェクトを作成し、そのリソースを解放します。

zipOut.close();

上記は、Java の Zip 関数を使用したファイル圧縮の完全なデモンストレーションです。読者は、必要に応じて適切な変更を加えることができます。ファイル圧縮に Zip 関数を使用する場合は、大きすぎるファイルを圧縮しないでください。圧縮しないと、メモリ オーバーフローの問題が発生する可能性があります。

以上がJavaでZip関数を使用してファイルを圧縮する方法の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。