Zip-Komprimierung, die in einer Java-Umgebung nicht beeinträchtigt wird

Wenn Sie eine Zip-Komprimierung einer Datei mit Java durchführen, wenn im zu komprimierenden Dateinamen japanische Zeichen verwendet werden In einigen Windows-Umgebungen traten beim Dekomprimieren verstümmelte Zeichen auf, sodass wir eine Problemumgehung organisiert haben.

An erster Stelle

Das gleiche Problem kann beim Öffnen einer unter Mac / Linux komprimierten Datei unter Windows auftreten. Insbesondere tritt es auf, wenn der Patch nicht unter Windows 7 oder Windows Server 2008 R2 angewendet wird. [^ 1]

~~ Ich bitte Sie, verschiedene Patches anzuwenden und den neuesten zu verwenden ~~ Abhängig von der Umgebung ist die Aktualisierung möglicherweise nicht einfach. In diesem Fall sollten wir dies programmseitig behandeln.

Implementierung

Dies ist ein Beispiel, das die durch das Argument angegebene Datei (oder das Verzeichnis) in eine Zip-Datei namens "packed.zip" komprimiert.

Von Java7 aus können Sie "Charset" an den Konstruktor von "ZipOutputStream" übergeben Wenn Sie "Charset.forName (" Shift-JIS ")" übergeben, können Sie eine Zip-Datei erstellen, die selbst in einer Windows-Umgebung nicht beschädigt wird.

Wenn Sie nach ähnlichen Problemen suchen, finden Sie einige Artikel, die das Paket "org.apache.tools.zip" enthalten müssen. Ab Java7 kann dies nur mit der Standardbibliothek realisiert werden.

ZipFile.java


package com.uskey512;

import java.io.BufferedInputStream;
import java.io.BufferedOutputStream;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.nio.charset.Charset;
import java.util.ArrayList;
import java.util.List;
import java.util.zip.ZipEntry;
import java.util.zip.ZipOutputStream;

public class ZipFile implements AutoCloseable {

    private byte[] buffer;
    private List<File> targetFiles;
    private ZipOutputStream zipOutputStream;

    private static final int DEFAULT_BUFFER_SIZE = 1024;

    public ZipFile(String fileName, String path) throws IOException {
        this(fileName, path, Charset.defaultCharset(), DEFAULT_BUFFER_SIZE);
    }

    public ZipFile(String fileName, String path, int bufferSize) throws IOException {
        this(fileName, path, Charset.defaultCharset(), bufferSize);
    }

    public ZipFile(String fileName, String path, Charset charset) throws IOException {
        this(fileName, path, charset, DEFAULT_BUFFER_SIZE);
    }

    public ZipFile(String fileName, String path, Charset charset, int bufferSize) throws IOException {
        File zipFile = new File(path + File.separator + fileName);
        buffer = new byte[bufferSize];
        targetFiles = new ArrayList<File>();
        zipOutputStream = new ZipOutputStream(new BufferedOutputStream(new FileOutputStream(zipFile)), charset);
    }

    public void addFile(String filePath) {
        targetFiles.add(new File(filePath));
    }

    public void build() {
        writeFiles(targetFiles.toArray(new File[0]));
    }

    private void writeFiles(File[] files) {
        for (File file : files) {
            if (file.isDirectory()) {
                writeFiles(file.listFiles());
            } else {
                try {
                    ZipEntry entry = new ZipEntry(file.getPath().replace('\\', '/'));
                    zipOutputStream.putNextEntry(entry);
                    try (InputStream is = new BufferedInputStream(new FileInputStream(file))) {
                        int readLength = 0;
                        while (0 < (readLength = is.read(buffer))) {
                            zipOutputStream.write(buffer, 0, readLength);
                        }
                    }
                } catch (IOException ioe) {
                    throw new RuntimeException("", ioe);
                }
            }
        }
    }

    @Override
    public void close() throws IOException {
        zipOutputStream.close();
    }
}

Main.java


package com.uskey512;

import java.io.IOException;
import java.nio.charset.Charset;

public class Main {

    public static void main(String[] args) {
        // try (ZipFile zipFile = new ZipFile("packed.zip", ".") { //Verwandeln
        try (ZipFile zipFile = new ZipFile("packed.zip", ".", Charset.forName("Shift-JIS"))) { //Nicht verstümmelt
            zipFile.addFile(args[0]);
            zipFile.build();
        } catch (IOException ioe) {
        }
    }
}

Recommended Posts

Zip-Komprimierung, die in einer Java-Umgebung nicht beeinträchtigt wird
Umlauts verstümmelte Charaktere
In MessageResources.properties beschriebene japanische Zeichen sind verstümmelt
Maßnahmen gegen verstümmelte Charaktere in Multipart Request mit Quarkus
Zip-Komprimierung, die in einer Java-Umgebung nicht beeinträchtigt wird
[Windows] [IntelliJ] [Java] [Tomcat] Erstellen Sie mit IntelliJ eine Umgebung für Tomcat 9
Maßnahmen gegen verstümmelte Charaktere in Multipart Request mit Quarkus
Beheben Sie den CreateProcess-Fehler = 206, wenn Sie Java in einer Windows-Umgebung ausführen
Verwenden Sie Java Web Start in einer OpenJDK-Umgebung unter Windows
Ändern Sie die Java-Codierung in Windows
[Windows] Java-Code ist verstümmelt
Durchsuchen Sie Java und MySQL PATH mit Umgebungsvariablen [Windows-Version]
Morphologische Analyse in Java mit Kuromoji
Entpacken Sie die Zip-Datei in Java
Einstellungen für Java-Umgebungsvariablen (Windows, AdoptOpenJDK11)
Tweak Markdown mit Java Flexmark-Java
Reduzieren Sie die Java / Maven-Erstellungszeit mit Nexus 3 in der OpenShift (okd 3.11) DevOps-Umgebung
Leistungseinbußen bei Java-Containern in der Menicoa-Umgebung
Bereiten Sie die Java-Entwicklungsumgebung mit VS Code vor
CSV-Analyse mit Feldumbruchzeichen
Rufen Sie die Windows-Benachrichtigungs-API in Java auf
Verwenden von JupyterLab + Java mit WSL unter Windows 10
Parallelitätsmethode in Java mit grundlegendem Beispiel
Map ohne Verwendung eines Arrays in Java
Bearbeiten Sie MySQL mit Befehlen in der Docker-Umgebung
Java String Byte String-Kürzung Unterstützt verstümmelte Zeichen
Spielen Sie die Framework 2.6 (Java) -Umgebungskonstruktion mit Eclipse
Mit dbunit 2.6.0 kommt poi ohne Erlaubnis herein
Lesen Sie die xlsx-Datei in Java mit Selenium
Teilen Sie eine Zeichenfolge in Java mit ". (Dot)"
Behandeln Sie große JSON mit Java Lambda
Aktualisieren der Java-Umgebung von Windows mit Chocolatey
Statische Analyse ausführen In der Windows-Umgebung ableiten
In einer VM-Umgebung erstellte Java-Anwendungsentwicklungsumgebung
In MessageResources.properties beschriebene japanische Zeichen sind verstümmelt
Vermeiden Sie verstümmelte Zeichen und teilen Sie das Dateisystem in der Docker-Umgebung Rstudio (auch Docoker-Compose).
Überprüfen Sie mit Java / Kotlin, ob Dateien unter Windows nicht in die Benutzerkontensteuerung geschrieben werden können