Подтвердить что ты не робот

Ошибка пути к файлу Java NIO

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

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

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

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

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

4b9b3361

Ответ 1

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

Ответ 2

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

ClassLoader classloader = Thread.currentThread().getContextClassLoader();
String platformIndependentPath = Paths.get(classloader.getResource(errorFile).toURI()).toString();

Ответ 3

Чтобы заставить его работать как с 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;

Ответ 4

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

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

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

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

Ответ 5

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

new File(Platform.getInstallLocation().getURL().getFile()).toString()

Ответ 6

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

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

или

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

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

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

Ответ 7

Обычная среда Windows

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

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

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

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

В моем окне Windows есть среда Linux-Like, поэтому мне пришлось изменить "/C:/" на "C:\\".

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

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

Ответ 8

В зависимости от того, как вы собираетесь использовать объект 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);