Compression Zip qui ne brouille pas dans l'environnement Java

Lors de l'exécution de la compression Zip d'un fichier avec Java, si des caractères japonais sont utilisés dans le nom du fichier à compresser Dans certains environnements Windows, des caractères déformés se sont produits lors de la décompression, nous avons donc organisé une solution de contournement.

En premier lieu

Le même problème peut se produire lors de l'ouverture d'un fichier compressé sous Mac / Linux sous Windows. Plus précisément, cela se produit lorsque le correctif n'est pas appliqué sur Windows 7 ou Windows Server 2008 R2. [^ 1]

~~ Je vous demande d'appliquer divers correctifs et d'utiliser le dernier ~~ Selon l'environnement, la mise à jour peut ne pas être facile, donc dans ce cas, gérons-la du côté du programme.

la mise en oeuvre

Ceci est un exemple qui compresse le fichier (ou répertoire) spécifié par l'argument dans un fichier Zip appelé compressé.zip.

Depuis Java7, vous pouvez passer Charset au constructeur de ZipOutputStream Si vous passez Charset.forName (" Shift-JIS "), vous pouvez créer un fichier Zip qui ne se déforme pas même dans un environnement Windows.

Si vous recherchez des problèmes similaires, vous trouverez des articles dont vous avez besoin pour inclure le package ʻorg.apache.tools.zip`. A partir de Java7, il ne peut être réalisé qu'avec la bibliothèque standard.

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", ".") { //Transformer
        try (ZipFile zipFile = new ZipFile("packed.zip", ".", Charset.forName("Shift-JIS"))) { //Pas brouillé
            zipFile.addFile(args[0]);
            zipFile.build();
        } catch (IOException ioe) {
        }
    }
}

Recommended Posts

Compression Zip qui ne brouille pas dans l'environnement Java
Caractères brouillés de tréma
Les caractères japonais décrits dans MessageResources.properties sont déformés
Mesures contre les caractères déformés dans la requête en plusieurs parties avec Quarkus
Compression Zip qui ne brouille pas dans l'environnement Java
[Windows] [IntelliJ] [Java] [Tomcat] Créer un environnement pour Tomcat 9 avec IntelliJ
Mesures contre les caractères déformés dans la requête en plusieurs parties avec Quarkus
Résoudre l'erreur CreateProcess = 206 lors de l'exécution de Java dans un environnement Windows
Utiliser Java Web Start dans un environnement OpenJDK sous Windows
Changer le codage Java dans Windows
[Windows] Le code Java est déformé
Parcourez Java et MySQL PATH avec des variables d'environnement [version Windows]
Analyse morphologique en Java avec Kuromoji
Décompressez le fichier zip en Java
Paramètres des variables d'environnement Java (Windows, AdoptOpenJDK11)
Tweak Markdown avec Java flexmark-java
Réduisez le temps de construction de Java / Maven avec Nexus 3 dans l'environnement DevOps OpenShift (okd 3.11)
Dégradation des performances du conteneur Java dans l'environnement Menikoa
Préparer l'environnement de développement Java avec VS Code
Analyse CSV avec des caractères de saut de champ
Appelez l'API de notification Windows en Java
Utilisation de JupyterLab + Java avec WSL sous Windows 10
Méthode de concurrence en Java avec exemple de base
Mapper sans utiliser de tableau en java
Modifier Mysql avec des commandes dans l'environnement Docker
Troncature de chaîne Java String Byte Prend en charge les caractères déformés
Construction de l'environnement Play Framework 2.6 (Java) avec Eclipse
Avec dbunit 2.6.0, poi arrive sans permission
Lire le fichier xlsx en Java avec Selenium
Diviser une chaîne avec ". (Dot)" en Java
Gérez d'énormes JSON avec Java Lambda
Mise à jour de l'environnement Java de Windows à l'aide de Chocolatey
Exécuter l'analyse statique Infer dans l'environnement Windows
Environnement de développement d'applications Java créé dans un environnement VM
Les caractères japonais décrits dans MessageResources.properties sont déformés
Évitez les caractères déformés et partagez le système de fichiers dans l'environnement Docker Rstudio (Docoker-compose également)
Vérifiez avec Java / Kotlin que les fichiers ne peuvent pas être écrits en UAC sous Windows