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

Aeq*_*tas 7 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();
}
Run Code Online (Sandbox Code Playgroud)

我正在尝试创建一个可以处理中文字符到文件名的编写器.所以我可以创建一个名为??.txtexample 的文件.

但是我得到了FileNotFoundException 上面的代码,它对英文字符完全正常,但不适用于汉字.

我按照这里的答案:如何用Java编写UTF-8文件?生成上面的代码,但它不起作用.

任何人都知道如何实现这一目标?

堆栈跟踪:

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)
Run Code Online (Sandbox Code Playgroud)

使用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();
Run Code Online (Sandbox Code Playgroud)

堆:

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)
Run Code Online (Sandbox Code Playgroud)

Cod*_*roc 5

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

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

在此输入图像描述

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

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)
Run Code Online (Sandbox Code Playgroud)

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

请更改控制台的字符编码,我坚信你正在使用某些IDE.可能是您已更改或您的控制台继承了字符编码,而不是编码这些字符.