ホームページ  >  記事  >  Java  >  Java での圧縮と解凍の例

Java での圧縮と解凍の例

零下一度
零下一度オリジナル
2017-07-16 17:02:181602ブラウズ

開発プロセス中、ハードディスクの容量を節約するためにファイルを圧縮する必要がある場合があります。では、Java を使用してファイルを圧縮および解凍するにはどうすればよいでしょうか。それはとても簡単です。Java はファイルの圧縮と解凍を行うパッケージを提供します。そのパッケージは java.util.zip です (注: このパッケージには非常に厄介な点があります。中国語のパスは文字化けします)。この

コード文字化け問題

を解決するには: Apache の ant.jar パッケージを使用するだけで、ネイティブ JDK でコードを作成する場合は、インポート パッケージ

1 を変更するだけで済みます。 point


ディレクトリエントリポイントは、圧縮ファイル内のファイルのマッピングであり、圧縮ファイルを表します。ファイルが圧縮されると、ディレクトリ エントリ ポイントが作成され、ファイルはそのディレクトリ エントリ ポイントに書き込まれます。解凍時に、ディレクトリ エントリ ポイントを取得し、ディレクトリ エントリ ポイントの内容をハードディスク上の指定されたファイルに書き込みます。

ディレクトリ エントリ ポイントがフォルダーの場合、名前はパス区切り文字で終わる必要があります。Windows オペレーティング システムでは、名前区切り文字は「/」です。

2. ファイルの自動作成

createNewFile() を呼び出してファイルを作成する場合でも、出力ストリームの作成時に出力ストリームがファイルの作成を担当する場合でも、親パスが既に設定されていることを確認する必要があります。存在する場合、ファイルは作成できません。

3. ディレクトリの作成

  • mkdirs(): 複数レベルのディレクトリを作成します。

  • mkdir(): 第 1 レベルのディレクトリを作成します。親パスが存在しない場合、作成は失敗します。

2 番目の圧縮

1. ディレクトリ エントリ ポイントを作成します

まず、ディレクトリ エントリ ポイントの名前は、現在のファイルの相対パスです。圧縮ファイル、フォルダーへのディレクトリ エントリ ポイント名は、ファイルと区別するために名前区切り文字で終わる必要があります。

ZipEntry entry = new ZipEntry(压缩文件夹名称 + File.separator+文件或文件夹路径);

2. ディレクトリ エントリ ポイントを書き込みます

ZipOutputStream 出力ストリームを使用して、対応するディレクトリ エントリ ポイントにファイルを書き込みます。書き込みが完了したら、ディレクトリ エントリ ポイントを閉じます。

3.デモ

package com.javase.io;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;import java.util.zip.ZipOutputStream;public class ZipUtils {    /**
     * 压缩一个文件夹
     * 
     * @throws IOException     */
    public void zipDirectory(String path) throws IOException {
        File file = new File(path);
        String parent = file.getParent();
        File zipFile = new File(parent, file.getName() + ".zip");
        ZipOutputStream zos = new ZipOutputStream(new FileOutputStream(zipFile));
        zip(zos, file, file.getName());
        zos.flush();
        zos.close();
    }    /**
     * 
     * @param zos
     *            压缩输出流
     * @param file
     *            当前需要压缩的文件
     * @param path
     *            当前文件相对于压缩文件夹的路径
     * @throws IOException     */
    private void zip(ZipOutputStream zos, File file, String path) throws IOException {        // 首先判断是文件,还是文件夹,文件直接写入目录进入点,文件夹则遍历
        if (file.isDirectory()) {
            ZipEntry entry = new ZipEntry(path + File.separator);// 文件夹的目录进入点必须以名称分隔符结尾            zos.putNextEntry(entry);
            File[] files = file.listFiles();            for (File x : files) {
                zip(zos, x, path + File.separator + x.getName());
            }
        } else {
            FileInputStream fis = new FileInputStream(file);// 目录进入点的名字是文件在压缩文件中的路径
            ZipEntry entry = new ZipEntry(path);
            zos.putNextEntry(entry);// 建立一个目录进入点

            int len = 0;            byte[] buf = new byte[1024];            while ((len = fis.read(buf)) != -1) {
                zos.write(buf, 0, len);
            }
            zos.flush();
            fis.close();
            zos.closeEntry();// 关闭当前目录进入点,将输入流移动下一个目录进入点        }
    }}

3つの解凍ファイル

1.基本的な考え方

ファイルを解凍するときは、まず、に従って、圧縮ファイルディレクトリのエントリポイントを取得しますディレクトリ エントリ ポイントは、ファイル

オブジェクト を作成し、ディレクトリ エントリ ポイントの内容をハードディスク ファイルに書き込みます。

2.デモ

package com.javase.io;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;import java.util.zip.ZipOutputStream;public class ZipUtils {private String basePath;    /**
     * 解压文件
     * 
     * @param unzip
     * @throws IOException     */
    public void unzip(String unzip) throws IOException {
        File file = new File(unzip);
        basePath = file.getParent();
        FileInputStream fis = new FileInputStream(file);
        ZipInputStream zis = new ZipInputStream(fis);
        unzip(zis);
    }    private void unzip(ZipInputStream zis) throws IOException {
        ZipEntry entry = zis.getNextEntry();        if (entry != null) {
            File file = new File(basePath + File.separator + entry.getName());            if (file.isDirectory()) {                // 可能存在空文件夹
                if (!file.exists())
                    file.mkdirs();
                unzip(zis);
            } else {
                File parentFile = file.getParentFile();                if (parentFile != null && !parentFile.exists())
                    parentFile.mkdirs();
                FileOutputStream fos = new FileOutputStream(file);// 输出流创建文件时必须保证父路径存在
                int len = 0;                byte[] buf = new byte[1024];                while ((len = zis.read(buf)) != -1) {
                    fos.write(buf, 0, len);
                }
                fos.flush();
                fos.close();
                zis.closeEntry();
                unzip(zis);
            }
        }
    }

}

以上がJava での圧縮と解凍の例の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

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