Я пытаюсь создать некоторые каталоги с национальными символами типа «äöü» и т. Д. К сожалению, я получаю это исключение всякий раз, когда это была предпринята попытка: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, поэтому похоже, что проблема связана с национальными символами в пределах пути ...
Преступник явно символ o-умлаута. Этот каталог уже существует? Если нет, вы получаете сообщение об ошибке, когда выполняете 'mkdir/home/pi/myFolder/löwen'? –
@JimGarrison Да, это проблема с символом ö. Нет, путь еще не существует, поэтому следующий код пытается его создать, если он еще не существует, но он терпит неудачу, когда он еще не создан. Если я делаю команду mkdir из bash через SSH, она работает отлично, поэтому я считаю это настолько странным. Может ли это быть связано с установкой Java/Tomcat? Но Tomcat, похоже, немного настроен на кодирование файлов с помощью UTF-8, поэтому я не знаю, какие другие возможные моменты есть. –
Является ли путь жестко закодированным где-то в источнике или он вводится пользователем или в файле свойств? Какой бы ни был источник имени пути, THAT находится в национальном наборе символов и по какой-то причине не преобразуется в UTF-8, что приводит к ошибке. –