Ответ 1
Путь \C:\Sample\sample.txt
не должен иметь ведущего \
. Это должно быть просто C:\Sample\sample.txt
Я использовал следующий код, чтобы получить путь
Path errorFilePath = FileSystems.getDefault().getPath(errorFile);
Когда я пытаюсь переместить файл с помощью файла NIO, я получаю следующую ошибку:
java.nio.file.InvalidPathException: Illegal char <:> at index 2: \C:\Sample\sample.txt
Я также попытался использовать URL.encode(errorFile)
, что приводит к той же ошибке.
Путь \C:\Sample\sample.txt
не должен иметь ведущего \
. Это должно быть просто C:\Sample\sample.txt
Вам нужно преобразовать найденный ресурс в URI. Он работает на всех платформах и защищает вас от возможных ошибок с помощью путей. Вы не должны беспокоиться о том, как выглядит полный путь, начинается ли это с "\" или других символов. Если вы думаете о таких деталях - вы делаете что-то не так.
ClassLoader classloader = Thread.currentThread().getContextClassLoader();
String platformIndependentPath = Paths.get(classloader.getResource(errorFile).toURI()).toString();
Чтобы заставить его работать как с 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;
Чтобы получить правильный путь в Windows или Linux на любом диске, вы можете сделать что-то вроде этого:
path = path.replaceFirst("^/(.:/)", "$1");
Это говорит: если начало строки - это косая черта, то символ, затем двоеточие и другая косая черта заменяют его символом, двоеточием и косой чертой (оставляя слэш в начале).
Если вы работаете в Linux, вы не должны заканчивать двоеточие на своем пути, и совпадения не будет. Если вы находитесь в Windows, это должно работать для любой буквы диска.
Другой способ избавиться от ведущего разделителя - создать новый файл и затем преобразовать его в строку:
new File(Platform.getInstallLocation().getURL().getFile()).toString()
попробуйте использовать вот так C:\\Sample\\sample.txt
Обратите внимание на двойную обратную косую черту. Поскольку обратная косая черта является escape-символом Java String, вы должны ввести два из них, чтобы представить один "реальный" обратный слэш.
или
Java позволяет использовать любой тип косой черты на любой платформе и переводит его соответствующим образом. Это означает, что вы можете ввести. C:/Sample/sample.txt
и он найдет тот же файл в Windows. Однако у нас все еще есть "корень" пути как проблема.
Самое простое решение для работы с файлами на нескольких платформах - всегда использовать относительные имена путей. Имя файла, например Sample/sample.txt
Отказ от ответственности: я не тестировал это в обычной среде Windows.
"\\C:\\"
должен быть "C:\\"
final Path errorFilePath = Paths.get(FileSystems.getDefault().getPath(errorFile).toString().replace("\\C:\\","C:\\"));
В моем окне Windows есть среда Linux-Like, поэтому мне пришлось изменить "/C:/"
на "C:\\"
.
Этот код был протестирован для работы с Linux-подобной средой Windows:
final Path errorFilePath = Paths.get(FileSystems.getDefault().getPath(errorFile).toString().replace("/C:/","C:\\"));
В зависимости от того, как вы собираетесь использовать объект 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);