Java使用文件名中的特殊字符保存文件

Java使用文件名中的特殊字符保存文件,java,character-encoding,Java,Character Encoding,我在Java文件编码方面遇到了问题 我有一个Java程序将输入流保存为具有给定文件名的文件,代码段如下: File out = new File(strFileName); Files.copy(inStream, out.toPath()); 它在Windows上工作正常,除非文件名包含一些特殊字符,如Ö,如果文件名中包含这些字符,则保存的文件将在Windows上显示一个乱码文件名 我知道通过应用JVM选项-Dfile.encoding=UTF-8可以解决这个问题,但我希望在我的代码中有一个

我在Java文件编码方面遇到了问题

我有一个Java程序将输入流保存为具有给定文件名的文件,代码段如下:

File out = new File(strFileName);
Files.copy(inStream, out.toPath());
它在Windows上工作正常,除非文件名包含一些特殊字符,如
Ö
,如果文件名中包含这些字符,则保存的文件将在Windows上显示一个乱码文件名

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

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

有人能解释一下幕后出了什么问题吗?有没有办法通过编程避免这个问题?我尝试从字符串中获取字节并更改编码,但没有成功

谢谢。

使用以下选项将有效:

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

设置
-Dfile.encoding
选项是否确实解决了问题?因为这是在读取文件时使用的,而不是文件名本身。您从哪里获得文件名字符串?似乎该参数实际上也会影响文件名的编码方式:@Thilo Yes JVM选项适用于此问题。当我使用瑞典文件名进行测试时发现了这个问题。您将什么分配给
strFileName
?它是从web应用程序输入的、从磁盘上的文件读取的、通过Swing或JavaFXUI输入的还是什么?您说调试显示了正确的字符。你是怎么调试的?你能提供一份工作吗?这台机器的默认编码是什么?真的吗?这似乎不太可能。这是一个近似值,它需要一个解码器操作才能获得特殊字符。您是否有一个链接来解释Windows文件系统API如何对URL编码进行特殊处理?还要注意的是,这个问题清楚地表明,只要将
file.encoding
设置为与操作系统希望看到的文件名字符集相匹配,就可以解决这个问题。你是对的,但他说他想要一个解决方案,在不改变JVM选项的情况下实现这种行为。我认为我的方法可以满足这个前提,不是吗?你确定这是完整的方法吗?URLEncoder将Ö字符转换为%E8%84%B0,我只得到一个%E8%84%B0.txt文件。我将使用字符串作为文件名,并希望在我的文件系统中保存一个Ö.txt。