我正在使用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