2010-10-27 75 views
2

我正在使用org.apache.commonspress.pressivers.zip.ZipArchiveOutputStream添加來自Subversion存儲庫的文件。 只要我不使用德文變音(ä,ö,ü)或文件名中的任何其他特殊字符,此工作正常。 我想知道什麼是最快的方式使其接受非ASCII字符?Apache Commons ZipArchiveOutputStream在添加非ASCII字符的文件名時中斷

def zip(repo: SVNRepository, out: OutputStream, url: String, resourceList: Seq 
     [SVNResource]) { 
    val zout = new ZipArchiveOutputStream(new BufferedOutputStream(out)) 
    zout.setEncoding("Cp437"); 
    zout.setFallbackToUTF8(true); 
    zout.setUseLanguageEncodingFlag(true); 
    zout.setCreateUnicodeExtraFields(ZipArchiveOutputStream.UnicodeExtraFieldPolicy.NOT_ENCODEABLE); 
    try { 
    for (resource <- resourceList) { 
     addFileToStream(repo, zout, resource) 
    } 
    } 
    finally { 
    zout.finish 
    zout.close 
    } 
} 

private def addFileToStream(repo: SVNRepository, zout: ZipArchiveOutputStream, resource:SVNResource): ZipArchiveOutputStream = { 
    val entry = resource.entry 
    val url = YSTRepo.getAbsolutePath(entry) 
    if (FILE == entry.getKind.toString) { 
    val file = new File(url) 
    val zipEntry = new ZipArchiveEntry(file, url) 
    zout.putArchiveEntry(zipEntry) 
    val baos = new ByteArrayOutputStream() 
    val fileprops = new SVNProperties() 
    repo.getFile(url, -1, fileprops, baos) 
    IOUtils.copy(new ByteArrayInputStream(baos.toByteArray), zout) 
    zout.closeArchiveEntry 
    } else if (DIR == entry.getKind.toString) { 
    if (resource.hasChildren) { 
     val dirProps = new SVNProperties() 
     val entries = repo.getDir(url, -1, dirProps, new java.util.ArrayList[SVNDirEntry]) 
     for (child <- SVNResource.listDir(repo, entries.toList.asInstanceOf[Seq SVNDirEntry]])) { 
     addFileToStream(repo, zout, child) 
     } 
    } 
    } 
    zout 
} 
+0

「破」是什麼意思?它是否會拋出異常?如果是,請張貼例外。如果沒有例外,它會創建一個本身不可讀的文件嗎?或者不能被另一個應用程序讀取? – Anon 2010-10-27 14:54:57

+0

對不起,不清楚:zip被寫入archive.zip。解壓後,我期望一個名爲über.pdf的文件。在WINXP下使用IZArc可以正確顯示文件名。我也可以用WindowsCompressedFolders打開它,但文件名是錯誤的,但它包含可讀字符。在Linux下,我無法打開該文件,因爲該名稱包含不可讀的字符。 – trajectory 2010-10-27 15:38:21

+0

聽起來這個zip是完全有效的,那麼你只需要研究用於從文件中提取的替代程序。 – 2010-10-27 15:47:56

回答

3

我解決了問題,通過設置

UnicodeExtraFieldPolicy.NOT_ENCODEABLE 

UnicodeExtraFieldPolicy.ALWAYS 

現在的文件名是正確使用Linux,解壓,Windows的壓縮後的文件夾,IZArc和WINZIP顯示。

0

您可以嘗試通過文件名通過URLEncoder的第一:http://download.oracle.com/javase/6/docs/api/java/net/URLEncoder.html

這將確保該壓縮文件名是純ASCII

當回讀出,使用URLDecoder收回全部UFT- 8字符集:http://download.oracle.com/javase/6/docs/api/java/net/URLDecoder.html

+0

這不意味着我需要控制extaction過程?該zip會流式傳輸到用戶的瀏覽器。 – trajectory 2010-10-27 15:54:53

+0

是的,它會:) – 2010-10-28 08:25:52

2

根據您的意見,這聽起來像真正的問題是Linux unzip程序和/或您的Linux文件系統支持的編碼。一種解決方案是通過-U選項進行解壓縮,這將轉義文件名中的任何Unicode字符。

這麼說,我還建議刪除以下行,當你寫你的壓縮文件:

zout.setEncoding("Cp437"); 
zout.setFallbackToUTF8(true); 
zout.setUseLanguageEncodingFlag(true); 

並用以下替換它們:

zout.setEncoding("UTF-8"); 

這將導致最高的便攜性。