2016-05-24 3 views
3

Я пытаюсь скопировать файл на Ubuntu машине, используя Java заявлениеInvalidPathException для китайского файла

Files.copy(new File("/tmp/source/测试.xlsx").toPath(), new File("/tmp/dest/测试.xlsx").toPath(), StandardCopyOption.REPLACE_EXISTING);

Но я получаю следующую ошибку

java.nio.file.InvalidPathException : Неверный ввод или ввод содержит unmappable characters: /tmp/source/测试 .xlsx at sun.nio.fs.UnixPath.encode (UnixPath.java:147) ~ [na: 1.8.0_91] на sun.nio .fs.U nixPath. (UnixPath.java:71) ~ [na: 1.8.0_91] на sun.nio.fs.UnixFileSystem.getPath (UnixFileSystem.java:281) ~ [na: 1.8.0_91] на java.io.File .toPath (File.java:2234) ~ [na: 1.8.0_91]

Это нормально работает, когда я запускаю его на своем затмении. Кроме того, код отлично работает со всеми английскими символами.

+0

«Это работает отлично, когда я запускаю его на своем eclipse_». Вы говорите, что это не работает, когда вы запускаете эту программу в командной строке? –

+0

Работает ли ваш Eclipse в другой операционной системе, чем Ubuntu? –

+0

@MadPiranha На моем затмении я запускаю его как отдельное приложение Java и передаю параметры с помощью основного метода. Проект, который я запускаю на ubuntu, - это проект maven, развернутый на tomcat, который запускается с использованием вызова REST API. – user3820369

ответ

4

Это может быть JDK Bug

Установите следующие свойства системы sun.jnu.encoding=UTF-8 и file.encoding=UTF-8.

  • Отметьте this, чтобы добавить системные свойства в плагин tomcat maven.
  • Используйте опцию -D, если в командной строке есть программа java. (-Dsun.jnu.encoding=UTF-8 -Dfile.encoding=UTF-8)
+0

Это работает на Java, но при запуске Java через двоичный двоичный файл, похоже, игнорирует свойства командной строки. Любая идея почему? 'groovy -Dsun.jnu.encoding = UTF-8 -Dfile.encoding = UTF-8 myfile.groovy' –

+1

В ответ на мой собственный вопрос, в качестве обходного пути вы можете использовать' export JAVA_OPTS = "- Dfile.encoding = UTF- 8" ' –

3

Я считаю, что это связано с установкой языка на машине, где вы хотите запустить приложение.

Возьмите folloing SNIPPET

public class Main { 
    public static void main(String[] args) throws IOException { 
     Path source = Paths.get("/tmp/source/测试.xlsx"); 
     Path destination = Paths.get("/tmp/dest/测试.xlsx"); 
     Files.copy(source, destination, StandardCopyOption.REPLACE_EXISTING); 
    } 
} 

компилировать

javac -encoding UTF8 Main.java 

бег с локаль UTF8

LANG=en_US.utf8 java sub.optimal.playground.Main 

Файл назначения будет создан (если предположить, что каталог существует и у вас есть права доступа).

запустить с локали C

LANG=C java sub.optimal.playground.Main 

выход

java.nio.file.InvalidPathException: Malformed input or input contains 
    unmappable characters: /tmp/source/??.xlsx 

Проверьте, если сеанс, в котором вы хотите запустить приложение использует локаль, которая поддерживает UTF8 (просто запустить locale).

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