我正在使用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
}
“破”是什么意思?它是否会抛出异常?如果是,请张贴例外。如果没有例外,它会创建一个本身不可读的文件吗?或者不能被另一个应用程序读取? – Anon 2010-10-27 14:54:57
对不起,不清楚:zip被写入archive.zip。解压后,我期望一个名为über.pdf的文件。在WINXP下使用IZArc可以正确显示文件名。我也可以用WindowsCompressedFolders打开它,但文件名是错误的,但它包含可读字符。在Linux下,我无法打开该文件,因为该名称包含不可读的字符。 – trajectory 2010-10-27 15:38:21
听起来这个zip是完全有效的,那么你只需要研究用于从文件中提取的替代程序。 – 2010-10-27 15:47:56