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