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.
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.
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