Ошибка пути к файлу Java NIO - PullRequest
43 голосов
/ 23 марта 2012

Я использовал следующий код, чтобы получить путь

Path errorFilePath = FileSystems.getDefault().getPath(errorFile);

Когда я пытаюсь переместить файл, используя File NIO, я получаю сообщение об ошибке ниже:

java.nio.file.InvalidPathException: Illegal char <:> at index 2: \C:\Sample\sample.txt

Я также пытался использовать URL.encode(errorFile), что приводит к той же ошибке.

Ответы [ 8 ]

32 голосов
/ 23 марта 2012

Путь \C:\Sample\sample.txt не должен иметь ведущего \. Это должно быть просто C:\Sample\sample.txt

31 голосов
/ 12 августа 2015

Вам необходимо преобразовать найденный ресурс в URI . Он работает на всех платформах и защищает вас от возможных ошибок с путями. Вы не должны беспокоиться о том, как выглядит полный путь, начинается ли он с '\' или других символов. Если вы думаете о таких деталях - вы делаете что-то не так.

ClassLoader classloader = Thread.currentThread().getContextClassLoader();
String platformIndependentPath = Paths.get(classloader.getResource(errorFile).toURI()).toString();
18 голосов
/ 27 мая 2014

Чтобы заставить его работать как в Windows, так и в Linux \ OS X, подумайте над этим:

String osAppropriatePath = System.getProperty( "os.name" ).contains( "indow" ) ? filePath.substring(1) : filePath;

Если вы хотите беспокоиться о производительности, я бы сохранил System.getProperty( "os.name" ).contains( "indow" ) как константу, такую ​​как

private static final boolean IS_WINDOWS = System.getProperty( "os.name" ).contains( "indow" );

и затем используйте:

String osAppropriatePath = IS_WINDOWS ? filePath.substring(1) : filePath;
15 голосов
/ 22 сентября 2015

Чтобы быть уверенным в правильности пути в Windows или Linux для любой буквы диска, вы можете сделать что-то вроде этого:

path = path.replaceFirst("^/(.:/)", "$1");

Это означает: если начало строки - косая черта, то символ, затем двоеточие и еще один слеш, замените его символом, двоеточием и косой чертой (оставив начальный слеш выключенным).

Если вы работаете в Linux, в вашем пути не должно быть двоеточия, и совпадений не будет. Если вы работаете в Windows, это должно работать для любой буквы диска.

2 голосов
/ 18 января 2018

Другой способ избавиться от ведущего разделителя - создать новый файл и преобразовать его в строку:

new File(Platform.getInstallLocation().getURL().getFile()).toString()
1 голос
/ 23 марта 2012

попробуйте использовать вот так C:\\Sample\\sample.txt

Обратите внимание на двойную обратную косую черту.Поскольку обратная косая черта является escape-символом Java String, вы должны ввести два из них, чтобы представить единственную, «настоящую» обратную косую черту.

или

Java позволяет использовать любой тип косой черты на любой платформе и переводить его соответствующим образом.Это означает, что вы можете печатать.C:/Sample/sample.txt

, и он найдет тот же файл в Windows.Однако у нас все еще есть «корень» пути как проблема.

Самое простое решение для работы с файлами на нескольких платформах - всегда использовать относительные имена путей.Имя файла, например Sample/sample.txt

0 голосов
/ 10 апреля 2019

В зависимости от того, как вы собираетесь использовать объект Path, вы можете вообще не использовать Path:

// works with normal files but on a deployed JAR gives "java.nio.file.InvalidPathException: Illegal char <:> "
URL urlIcon = MyGui.class.getResource("myIcon.png");
Path pathIcon = new File(urlIcon.getPath()).toPath();
byte bytesIcon[] = Files.readAllBytes(pathIcon);


// works with normal files and with files inside JAR:
InputStream in = MyGui.class.getClassLoader().getResourceAsStream("myIcon.png");
byte bytesIcon[] = new byte[5000];
in.read(bytesIcon);
0 голосов
/ 14 августа 2013

Нормальная среда Windows

Отказ от ответственности: я не проверял это в обычной среде Windows.

"\\C:\\" должно быть "C:\\"

final Path errorFilePath = Paths.get(FileSystems.getDefault().getPath(errorFile).toString().replace("\\C:\\","C:\\"));

Linux-подобная среда Windows

В моем Windows установлена ​​среда, похожая на Linux, поэтому мне пришлось изменить "/C:/" на "C:\\".

Этот код был протестирован для работы в Linux-подобной среде Windows:

final Path errorFilePath = Paths.get(FileSystems.getDefault().getPath(errorFile).toString().replace("/C:/","C:\\"));
...