我正在尝试创建一些带有像"äöü"等国家符号的目录。不幸的是,每当尝试这样做时,我都会收到这个异常:
java.nio.file.InvalidPathException: Malformed input or input contains unmappable characters: /home/pi/myFolder/löwen
at sun.nio.fs.UnixPath.encode(UnixPath.java:147)
at sun.nio.fs.UnixPath.<init>(UnixPath.java:71)
at sun.nio.fs.UnixFileSystem.getPath(UnixFileSystem.java:281)
at java.nio.file.Paths.get(Paths.java:84)
at org.someone.something.file.PathManager.createPathIfNecessary(PathManager.java:161)
...
at java.lang.Thread.run(Thread.java:744)
它出现在我的代码中,看起来像这样:
public static void createPathIfNecessary(String directoryPath) throws IOException {
Path path = Paths.get(directoryPath);
// if directory exists?
if (!Files.exists(path)) {
Files.createDirectories(path);
} else if (!Files.isDirectory(path)) {
throw new IOException("The path " + path + " is not a directory as expected!");
}
}
我搜索了可能的解决方案,大多数建议将语言环境设置为UTF-8,所以我认为如果在Linux中将语言环境设置为UTF-8,则可以解决此问题。但是我发现一直都已经是UTF-8,并且尽管重新设置后,仍然存在相同的问题。
$ locale
LANG=en_US.UTF-8
LANGUAGE=
LC_CTYPE="en_US.UTF-8"
LC_NUMERIC="en_US.UTF-8"
LC_TIME="en_US.UTF-8"
LC_COLLATE="en_US.UTF-8"
LC_MONETARY="en_US.UTF-8"
LC_MESSAGES="en_US.UTF-8"
LC_PAPER="en_US.UTF-8"
LC_NAME="en_US.UTF-8"
LC_ADDRESS="en_US.UTF-8"
LC_TELEPHONE="en_US.UTF-8"
LC_MEASUREMENT="en_US.UTF-8"
LC_IDENTIFICATION="en_US.UTF-8"
LC_ALL=
我在Windows 7上没有这个问题,它可以完美地创建目录,所以我想知道是否需要改进Java代码以更好地处理此情况,或者在我的Linux中更改一些内容。
我正在运行的Linux是Raspberry Pi 2上的Raspbian:
$ cat /etc/*-release
PRETTY_NAME="Raspbian GNU/Linux 7 (wheezy)"
NAME="Raspbian GNU/Linux"
VERSION_ID="7"
VERSION="7 (wheezy)"
ID=raspbian
ID_LIKE=debian
ANSI_COLOR="1;31"
HOME_URL="http://www.raspbian.org/"
SUPPORT_URL="http://www.raspbian.org/RaspbianForums"
BUG_REPORT_URL="http://www.raspbian.org/RaspbianBugs"
我的应用程序在Tomcat 7服务器上运行(Java版本是1.8),我的setenv.sh以以下方式开始:export JAVA_OPTS="-Dfile.encoding=UTF-8 ...
有没有人有解决这个问题的方法?我需要能够在目录/文件名中使用那些国家符号...
编辑:
在我的Tomcat的setenv.sh开头添加了额外选项Dsun.jnu.encoding=UTF-8并重新启动后,某些内容已更改。
目前我的setenv.sh开头看起来像这样:
export JAVA_OPTS="-Dsun.jnu.encoding=UTF-8 -Dfile.encoding=UTF-8
看起来这个异常已经消失了,国家符号文件夹也被创建了,但问题似乎没有完全解决,每当我尝试在该目录中创建/写入文件时,我现在会得到:
java.io.FileNotFoundException: /home/pi/myFolder/löwen/Lowen.tmp (No such file or directory)
at java.io.FileOutputStream.open(Native Method)
at java.io.FileOutputStream.<init>(FileOutputStream.java:206)
at java.io.FileOutputStream.<init>(FileOutputStream.java:156)
at org.someone.something.MyFileWriter.downloadFiles(MyFileWriter.java:364)
...
at java.lang.Thread.run(Thread.java:744)
出问题的代码如下:
// output here
File myOutputFile = new File(filePath);
FileOutputStream out = (new FileOutputStream(myOutputFile));
out.write(bytes);
out.close();
当试图使用从上一个异常中获取的路径和添加的文件名创建的字符串来初始化FileOutputStream时,似乎会在(new FileOutputStream(myOutputFile))上失败。
因此现在目录已经创建,但在其中编写或创建任何内容仍会导致上述异常,尽管其中的文件甚至不包含国际符号。
在没有国际符号的情况下创建路径和文件与在setenv.sh更改之前一样完美地工作,因此看起来问题仍然与路径中的国际符号有关...
mkdir /home/pi/myFolder/löwen
时是否会出现错误? - Jim Garrison