2016-08-27 4 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, но я fou что он уже был 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 я бег его является Raspbian на Raspberry Pi 2:

$ 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 ...

У кого-нибудь есть решение этой проблемы? Мне нужно, чтобы иметь возможность использовать эти национальные символы в именах каталогов/файлов ...

EDIT:

После добавления дополнительной опции Dsun.jnu.encoding = UTF-8 в начале моей SETENV .sh для Tomcat и перезапуск что-то изменилось.

В настоящее время мой старт 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 Да, это проблема с символом ö. Нет, путь еще не существует, поэтому следующий код пытается его создать, если он еще не существует, но он терпит неудачу, когда он еще не создан. Если я делаю команду mkdir из bash через SSH, она работает отлично, поэтому я считаю это настолько странным. Может ли это быть связано с установкой Java/Tomcat? Но Tomcat, похоже, немного настроен на кодирование файлов с помощью UTF-8, поэтому я не знаю, какие другие возможные моменты есть. –

+0

Является ли путь жестко закодированным где-то в источнике или он вводится пользователем или в файле свойств? Какой бы ни был источник имени пути, THAT находится в национальном наборе символов и по какой-то причине не преобразуется в UTF-8, что приводит к ошибке. –

ответ

0

Если национальные символы жестко закодированы в вашем источнике, преобразуйте исходный файл в ту же кодировку.Вы можете использовать Vim:

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

Если есть проблема, то вы получите сообщение ("unmappable характер (...)").

Для меня проблема связана либо с 1. символами жесткого кодирования в некорректном кодировании, либо 2. каким-то образом теряется кодирование при передаче пути к методу.

Смежные вопросы