跳至主要内容

Java 壓縮檔內的中文檔案名亂碼

假設程式欲將多個檔案打包成一個壓縮檔,
即使已用 ZipOutputStream 的 setEncoding 方法指定檔名和檔案的內容編碼格式,
仍造成壓縮內中文檔名的檔案顯示不出來,或檔名是亂碼,

此時僅需將 ZipOutputStream 與 ZipEntry 類別從 commons-compress.jar 換成 apache-ant.jar
類別的建構子、方法、常數大致相同,使用到的地方幾乎不需改變,只要更改 import 的 package

Package 調整

  • 捨棄 commons-compress.jar
  • 改用 apache-ant.jar
    //原先(來自於commons-compress.jar)
import org.apache.commons.compress.zip.ZipEntry;
import org.apache.commons.compress.zip.ZipOutputStream;

//改成(來自於apache-ant.jar)
import org.apache.tools.zip.ZipEntry;
import org.apache.tools.zip.ZipOutputStream;

壓縮範例


public byte[] zipFileExample(Project project, Encoding encoding) {
List<AttachedFile> files = new ArrayList<AttachedFile>();

ByteArrayOutputStream bos = new ByteArrayOutputStream();
ZipOutputStream ziops = new ZipOutputStream(bos);
ziops.setEncoding(encoding.getValue());

try {
for (AttachedFile resource : files) {
String content = resource.getFileContent();
String fileName = resource.getFileNameWithExtension();
ByteArrayOutputStream baos = new ByteArrayOutputStream();

formFileToOutputStream(content, baos);

ziops.setMethod(ZipOutputStream.DEFLATED);
ZipEntry zipEntry = new ZipEntry(fileName);
ziops.putNextEntry(zipEntry);

baos.writeTo(ziops);
}

} catch (IOException e) {
throw new RuntimeException(e);
} finally {
IOUtils.closeQuietly(ziops);
IOUtils.closeQuietly(bos);
}

return bos.toByteArray();
}

其他