2016-08-27 39 views
4

"ööü"などの国旗があるディレクトリを作成しようとしています。残念ながら、試みられている:それはこのようなルックスを発生java.nio.file.InvalidPathException:国別文字を使用すると、不正な入力または入力にマップできない文字が含まれています

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は、ラズベリーパイ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" 

私は私のsetenv、(Javaのバージョンは、私は信じて1.8である)のTomcat 7 Server上で自分のアプリケーションを実行しています。 shで始まる:export JAVA_OPTS="-Dfile.encoding=UTF-8 ...

誰でもこの問題の解決策がありますか?私のsetenvの開始時に余分なオプションDsun.jnu.encoding = UTF-8を追加した後

:私は、ディレクトリ/ファイル名でこれらの国家のシンボルを使用できるようにする必要があります...

EDIT Tomcatの.shを変更して何かを再起動してください。

現在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(myOutputFile))。 FileOutputStreamをFileオブジェクトで初期化しようとすると、上の例外のパスから取得された文字列から作成されたパスと最後に追加されたファイル名が含まれます。

これでディレクトリが作成されましたが、その内部に何かを書き込んだり作成したりすると、上記の例外が発生しますが、その中のファイルには国旗が含まれていません。

国シンボルがないときにパスとファイルを作成するのは、setenv.shの変更前と同じように機能するため、パス内の国のシンボルにも問題があるようです。

+0

犯人は明らかにo-ウムラウト文字です。そのディレクトリはすでに存在していますか?もしそうでなければ、 'mkdir/home/pi/myFolder /löwen'を実行するとエラーになりますか? –

+0

@JimGarrisonはい、問題の原因となっているのはö文字です。いいえ、パスはまだありません。したがって、コードはまだ作成されていない場合は作成を試みますが、まだ作成されていない場合は失敗します。私がbashからSSH経由でmkdirコマンドを実行すると、それは完全に動作します。 Java/Tomcatの設定に関連付けることはできますか?しかし、TomcatはUTF-8でファイルエンコーディングを行うように設定されているようですので、他にどのような可能性があるのか​​分かりません。 –

+0

パスはソースのどこかにハードコードされているのですか、それともユーザー入力かプロパティファイルですか?パス名のソースが何であれ、それは国別文字セットにあり、何らかの理由でUTF-8に変換されていないため、エラーになります。 –

答えて

0

ソースで国別文字がハードコードされている場合は、ソースファイルを同じエンコードに変換します。あなたはVimを使用することができます。

vim SourceClassWithHardcodedCharacters.java 
:set fileencoding=utf-8<Enter> 
:w<Enter> 

問題がある場合は、あなたがメッセージ(「マップできない文字(...を)」)を取得します。

私にとって、問題は不正なエンコーディングのハードコーディング文字と関連しています。2.メソッドにパスを渡している途中で何とかエンコーディングが失われました。

関連する問題