首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >java.nio.file.InvalidPathException:格式错误的输入或输入在使用国家字符时包含不可映射的字符。

java.nio.file.InvalidPathException:格式错误的输入或输入在使用国家字符时包含不可映射的字符。
EN

Stack Overflow用户
提问于 2016-08-27 20:47:30
回答 2查看 31.2K关注 0票数 16

我正在尝试创建一些目录,这些目录中有“aü”等国家符号。不幸的是,每当有人试图这样做时,我就会遇到这样的异常:

代码语言:javascript
运行
复制
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)

它发生的代码如下所示:

代码语言:javascript
运行
复制
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,尽管最近设置了它,我仍然有同样的问题。

代码语言:javascript
运行
复制
 $ 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:

代码语言:javascript
运行
复制
$ 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.code=utf-8,然后重新启动更改的内容。

目前,我开始使用setenv.sh的方式如下

代码语言:javascript
运行
复制
export JAVA_OPTS="-Dsun.jnu.encoding=UTF-8 -Dfile.encoding=UTF-8 

这个异常似乎已经消失,并且创建了带有国家符号的文件夹,但是问题似乎没有完全解决,每当我试图创建/写入该目录中的文件时,我现在得到:

代码语言:javascript
运行
复制
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)

发生这种情况的代码如下所示:

代码语言:javascript
运行
复制
// output here
File myOutputFile = new File(filePath);
FileOutputStream out = (new FileOutputStream(myOutputFile));
out.write(bytes);
out.close();

它似乎失败了(新的FileOutputStream(myOutputFile));当它试图用filename初始化FileOutputStream时,它的路径是从上面的异常中从路径中检索到的字符串创建的,并在最后添加了一个文件名。

因此,现在创建了目录,但是在目录中写入或创建任何内容仍然会导致上述异常,尽管其中的文件不包含国家符号。

在没有国家符号的情况下,创建路径和文件就像在setenv.sh更改之前一样完美,因此问题似乎仍然连接到路径中的国家符号。

EN

Stack Overflow用户

发布于 2016-08-27 21:20:31

如果源中的国家字符是硬编码的,则将源文件转换为相同的编码。您可以使用vim:

代码语言:javascript
运行
复制
vim SourceClassWithHardcodedCharacters.java
:set fileencoding=utf-8<Enter>
:w<Enter>

如果有问题,您将收到一条消息(“不可映射字符(.)”)。

对我来说,问题要么与1.硬编码字符的错误编码有关,要么与2.在将路径传递到方法时以某种方式丢失编码有关。

票数 1
EN
查看全部 2 条回答
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/39185613

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档