Java中文件名中的特殊字符

3

我试图写一个带有特殊字符的文件名,例如“tééé ê.mp3”,但是文件名总是用“?”代替字符“é”。我尝试了几种方法,但是没有找到解决办法:

String musicName = new String("tééé ê.mp3".getBytes(), "UTF-8");
OutputStreamWriter bw = new OutputStreamWriter(new FileOutputStream(FILE_PATH+"musics/"+musicName), "UTF-8");
bw.write(data);
bw.close();

我也尝试过这种方法。
OutputStreamWriter bw = new OutputStreamWriter(new FileOutputStream(URLDecoder.decode(FILE_PATH+"musics/tééé ê.mp3", "UTF-8")), "UTF-8");
bw.write(data);
bw.close();

有些文件系统甚至不支持这样的文件名。你为什么要写这样的文件名呢? - Willem Van Onsem
2
因为我正在构建的系统需要接受具有特殊字符文件名的上传文件。 - pedrodurek
撇开Java不谈:在这个系统上(顺便问一下,是哪个系统?),你能否创建一个文件并以这些字符命名? - laune
1
是的,我正在使用Mac OS系统,并且可以手动创建带有特殊字符的文件。 - pedrodurek
@pedrodurek:这并不取决于操作系统本身,而是取决于所使用的文件系统。例如,FAT 不行,而 NTFS 可以。 - Willem Van Onsem
它是HFS+系统文件。 - pedrodurek
1个回答

1
尝试使用Files
final Path target = Paths.get("tééé ê.mp3");

try (
    final OutputStream out = Files.newOutputStream(target, StandardOpenOption.CREATE_NEW);
) {
    // write
}

现在,如果你的文件系统不支持这样的文件名,你将会收到一个InvalidPathException异常;与File不同,新的API拒绝创建可能无法读取的文件名。
如果确实无法创建路径,那么你需要找到一种转义和还原的方法;也许将另一个名称写入某种数据库或其他地方。
请注意,InvalidPathException未经检查的异常;因此,你必须显式捕获此异常。还要注意,如果JVM当前使用的字符编码不适合生成文件名,你可能会收到此异常。

文件名为"t%E9%E9%E9 %EA.mp3"。你知道我该如何修复它吗? - pedrodurek
嗯,看起来问题出在你的终端上了;也许它无法显示这样的字符? - fge
你的JVM使用的编码是什么? - fge
1
你应该使用UTF-8,而不是其他的编码方式。 - fge
我将项目放置在 Apache 中,它可以运行。我认为可能是 Eclipse 的问题。你知道可能是什么问题,并且如何解决吗? - pedrodurek

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接