2017-02-21 299 views
4

我在Java文件编码方面遇到问题。Java以文件名保存带有特殊字符的文件

我有一个Java程序将一个输入流保存为一个给定的文件名的文件,代码片段是这样的:

File out = new File(strFileName); 
Files.copy(inStream, out.toPath()); 

它工作正常的Windows,除非文件名中包含一些特殊字符,如Ö,这些字符在文件名中,保存的文件将在Windows上显示乱码的文件名。

据我所知,通过应用JVM选项-Dfile.encoding=UTF-8这个问题可以修复,但我会在我的代码中有一个解决方案,而不是要求我的所有用户更改他们的JVM选项。

在调试程序时,我可以看到文件名字符串总是显示正确的字符,所以我猜这个问题不是关于内部编码。

请问有人能解释幕后出了什么问题吗?有没有一种方法来编程避免这个问题?我试图从字符串中获取字节并更改编码,但它不起作用。

谢谢。

+0

是否设置'-Dfile.encoding'选项实际上解决这个问题?因为在从文件读取时使用它,而不是为文件名本身。你从哪里得到文件名字符串? – Thilo

+0

看来参数确实也会影响文件名的编码方式:http://stackoverflow.com/questions/9196950/setting-file-name-encoding – Thilo

+0

@Thilo是的,JVM选项适用于这个问题。当我用瑞典文件名测试时发现问题。 –

回答

0

使用URLEncoder class将工作:

String name = URLEncoder.encode("fileName#", "UTF-8"); 
File output = new File(name); 
+0

真的吗?这似乎不太可能。 – Thilo

+0

这是一个近似值,它需要一个解码器操作才能获得特殊字符 –

+0

您是否有链接解释了Windows文件系统API如何对URL编码进行特殊处理?还要注意,这个问题清楚地表明,只需将'file.encoding'设置为与操作系统希望查看文件名的字符集相匹配即可解决问题。 – Thilo

相关问题