无法将中文字符写入文件名
Cannot write chinese characters to a filename
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
,如下所示,
现在,在 运行 运行程序后,我在控制台中得到以下输出,
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。可能是您已更改或您的控制台继承了不应该对这些字符进行编码的字符编码。
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
,如下所示,
现在,在 运行 运行程序后,我在控制台中得到以下输出,
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。可能是您已更改或您的控制台继承了不应该对这些字符进行编码的字符编码。