Heim > Java > javaLernprogramm > Hauptteil

Komprimierungs- und Dekomprimierungsbeispiele in Java

零下一度
Freigeben: 2017-07-16 17:02:18
Original
1546 Leute haben es durchsucht

Während des Entwicklungsprozesses ist es manchmal notwendig, Dateien zu komprimieren, um Festplattenspeicher zu sparen. Wie kann man also Dateien mit Java komprimieren und dekomprimieren? Es ist ganz einfach. Java stellt uns ein Paket zur Verfügung, das für die Komprimierung und Dekomprimierung von Dateien verantwortlich ist. (Hinweis: Dieses Paket hat einen sehr ärgerlichen Punkt, der chinesische Pfad wird verstümmelt)

So lösen Sie dieses Problem mit verstümmeltem Code: Verwenden Sie einfach das ant.jar-Paket von Apache. Der Code ändert sich nicht. Wenn Sie ihn mit nativem JDK schreiben, müssen Sie nur das Importpaket ändern . Genau wie

1. Verzeichniseinstiegspunkt

Der Verzeichniseinstiegspunkt ist die Zuordnung von Dateien in komprimierten Dateien, die komprimierte Dateien darstellen. Wenn eine Datei komprimiert wird, wird ein Verzeichniseinstiegspunkt erstellt und die Datei wird an diesen Verzeichniseinstiegspunkt geschrieben. Rufen Sie beim Dekomprimieren den Verzeichniseinstiegspunkt ab und schreiben Sie den Inhalt des Verzeichniseinstiegspunkts in die angegebene Datei auf der Festplatte.

Wenn der Verzeichniseinstiegspunkt ein Ordner ist, muss der Name mit einem Pfadtrennzeichen enden. Im Windows-Betriebssystem ist das Namenstrennzeichen „/“.

2. Automatische Erstellung von Dateien

Gibt an, ob createNewFile() aufgerufen wird, um eine Datei zu erstellen, oder ob der Ausgabestream für deren Erstellung verantwortlich ist Beim Erstellen einer Ausgabestream-Datei muss sichergestellt werden, dass der übergeordnete Pfad bereits vorhanden ist, andernfalls kann die Datei nicht erstellt werden.

3. Verzeichniserstellung

  • mkdirs(): Erstellen Sie ein mehrstufiges Verzeichnis.

  • mkdir(): Erstellen Sie ein Verzeichnis der ersten Ebene. Wenn der übergeordnete Pfad nicht vorhanden ist, schlägt die Erstellung fehl.

Zweite Komprimierung

1. Verzeichniseinstiegspunkt erstellen

Erstellen Sie zunächst einen Verzeichniseinstiegspunkt für eine Datei oder einen Ordner. Der Name des Verzeichniseinstiegspunkts ist der Pfad der aktuellen Datei relativ zur komprimierten Datei. Der Verzeichniseinstiegspunktname des Ordners muss zur Unterscheidung mit einem Namenstrennzeichen enden aus der Datei.


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

2. Schreiben Sie den Verzeichniseinstiegspunkt

Verwenden Sie zum Schreiben den ZipOutputStream-Ausgabestream Die Datei Geben Sie den entsprechenden Verzeichniseinstiegspunkt ein, der Schreibvorgang ist abgeschlossen und der Verzeichniseinstiegspunkt wird geschlossen.

3.Demo


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();// 关闭当前目录进入点,将输入流移动下一个目录进入点        }
    }}
Nach dem Login kopieren

Drei dekomprimierte Dateien

1. Grundidee

Ermitteln Sie beim Dekomprimieren einer Datei zunächst den Verzeichniseintragspunkt in der komprimierten Datei Gemäß diesem Verzeichniseinstiegspunkt wird ein Datei--Objekt erstellt und der Inhalt des Verzeichniseinstiegspunkts in eine Festplattendatei geschrieben.

2.Demo


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);
            }
        }
    }

}
Nach dem Login kopieren

Das obige ist der detaillierte Inhalt vonKomprimierungs- und Dekomprimierungsbeispiele in Java. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!

Verwandte Etiketten:
Quelle:php.cn
Erklärung dieser Website
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn
Beliebte Tutorials
Mehr>
Neueste Downloads
Mehr>
Web-Effekte
Quellcode der Website
Website-Materialien
Frontend-Vorlage
Über uns Haftungsausschluss Sitemap
Chinesische PHP-Website:Online-PHP-Schulung für das Gemeinwohl,Helfen Sie PHP-Lernenden, sich schnell weiterzuentwickeln!