java - 无法将中文字符写入文件名

标签 java file internationalization

public static void main(String[] args) throws IOException
{
    Scanner in = new Scanner(System.in);
    String fileName = in.nextLine();

    Writer out = new BufferedWriter(new OutputStreamWriter(
            new FileOutputStream("C:/temp/"+fileName+".txt"), "UTF-8"));//Ex thrown
    out.close();
}

我正在尝试创建一个可以将中文字符处理为文件名的编写器。例如,我可以创建一个名为 你好.txt 的文件。

但是我用上面的代码得到了一个FileNotFoundException,它对英文字符工作得很好,但对中文字符就不行。

我按照这里的答案:How to write a UTF-8 file with Java?生成上述代码,但它不起作用。

有人知道我该怎么做吗?

堆栈跟踪:

Exception in thread "main" java.io.FileNotFoundException: C:\temp\??.txt (The filename, directory name, or volume label syntax is incorrect)
    at java.io.FileOutputStream.open0(Native Method)
    at java.io.FileOutputStream.open(Unknown Source)
    at java.io.FileOutputStream.<init>(Unknown Source)
    at java.io.FileOutputStream.<init>(Unknown Source)

使用 NIO:

Path path = Paths.get("C:/temp/"+fileName+".txt");//throws ex
Charset charset = Charset.forName("UTF-8");
Path file = Files.createFile(path);
BufferedWriter  bufferedWriter = Files.newBufferedWriter(file, charset);
bufferedWriter.close();

堆栈:

Exception in thread "main" java.nio.file.InvalidPathException: Illegal char <?> at index 8: C:/temp/?.txt
    at sun.nio.fs.WindowsPathParser.normalize(Unknown Source)
    at sun.nio.fs.WindowsPathParser.parse(Unknown Source)
    at sun.nio.fs.WindowsPathParser.parse(Unknown Source)
    at sun.nio.fs.WindowsPath.parse(Unknown Source)
    at sun.nio.fs.WindowsFileSystem.getPath(Unknown Source)
    at java.nio.file.Paths.get(Unknown Source)

最佳答案

我发现这个问题与eclipse控制台的字符编码有关,与Java无关。

我使用了相同的代码并以不同的方式使用了Run Configuration,如下所示,

enter image description here

现在运行程序后,我在控制台中得到以下输出,

Exception in thread "main" java.io.FileNotFoundException: C:\temp\??.txt (The filename, directory name, or volume label syntax is incorrect)
    at java.io.FileOutputStream.open(Native Method)
    at java.io.FileOutputStream.<init>(FileOutputStream.java:206)
    at java.io.FileOutputStream.<init>(FileOutputStream.java:95)
    at Test.main(Test.java:21)

结论:这里对于ISO-8859-1编码在运行配置Scanner将无法从控制台正确读取这些字符,因为控制台具有不同的字符编码,您将有 ?? 作为 filename

请为您的控制台更改字符编码,我坚信您正在使用某些 IDE。可能是您已更改或您的控制台继承了不应该对这些字符进行编码的字符编码。

关于java - 无法将中文字符写入文件名,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32195708/

相关文章:

java - Actor 之间的事件

java - 在 mac osx 上安装 hadoop 2.3

java - 因为我可以生成自动通知

java - 我想将大写字母转换为小写字母,反之亦然

c - 我的函数 "openfile"有什么问题

c++ - Linux 上的 tchar.h

java - Hibernate validator 中的国际化

javascript - JavaScript 中的文件扩展名验证

python - 从文件读取并根据文件输入实例化新类

javascript - 如何使用 thymeleaf 将翻译放入 javascript