2010-10-27 76 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"); 

这将导致最高的便携性。