我在IBM Integration Bus中运行了一个小型Java应用程序,它安装在AIX服务器中,字符编码设置为ISO-8959-1。
我的应用程序正在创建一个ZIP文件,其中接收的文件名作为参数。我在文件系统中有一个名为“WebsërvícèsGuide.pdf”的文件,我想要压缩,但我不能。
这是我的代码:
String zipFilePath = "/tmp/EventAttachments_2018.01.25.11.39.34.zip";
// Streams buffer
int BUFFER = 2048;
// Open I/O Buffered Streams
BufferedInputStream origin = null;
FileOutputStream dest = new FileOutputStream(zipFilePath);
ZipOutputStream out = new ZipOutputStream(new BufferedOutputStream(dest));
byte data[] = new byte[BUFFER];
// Oprn File Stream to my file
Path currentFilePath = Paths.get("/tmp/Websërvícès Guide.pdf");
InputStream fi = Files.newInputStream(currentFilePath, StandardOpenOption.READ);
origin = new BufferedInputStream(fi, BUFFER);
ZipEntry entry = new ZipEntry("Websërvícès Guide.pdf");
out.putNextEntry(entry);
int count;
while ((count = origin.read(data, 0, BUFFER)) != -1) {
out.write(data, 0, count);
}
origin.close();
out.close();
在 Files.newInputStream 行中抛出“找不到文件”异常。 我已经读过,当检查存在特殊字符的文件时,Java无法正常工作等等。我无法在JVM参数中执行更改,因为代码在IBM JVM中执行。
有关如何解决此问题并在ZIP中正确打包文件的想法吗?
谢谢
答案 0 :(得分:0)
您可以尝试在运行Java程序时将以下标志传递给
-Dsun.jnu.encoding=UTF-8
答案 1 :(得分:0)
首先:在您的代码中,您没有处理可能引发的任何异常。我建议处理方法的异常或使方法抛出异常并在更高级别处理它。但在某处你需要处理异常。 也许这已经成了问题。 (见https://stackoverflow.com/a/155655/8896833)
第二:根据ISO-8959-1,应涵盖文件名中使用的所有字符。在您尝试访问该文件时,您是否确定您的程序正在运行的路径?
答案 2 :(得分:0)
尝试使用URLDecoder
类方法decode(String string, String encoding);
例如:
String path = URLDecoder.decode("Websërvícès Guide.pdf", "UTF-8"));