java относительный путь к файлу

В данной статье мы рассмотрим три примера формирования пути к файлу в Java, используя при этом разные приемы:

  1. File.separator или System.getProperty(«file.separator») (Рекомендовано)
  2. File file = new File(workDir, filename) (Рекомендовано)
  3. Задание разделителя каталогов вручную (Не рекомендовано)

File.separator

Традиционный (и самый распространенный) способ формирования полного пути к файлу в мире Java — использование константы File.separator или вызов метода System.getProperty(«file.separator») . Оба этих способа приводят к одному результату — будет возвращен правильный разделитель каталогов в зависимости от операционной системы:

Вывод данной программы будет примерно таким:

Использование конструктора new File()

Для получения полного пути к файлу можно воспользоваться конструктором класса File с двумя аргументами: путь к файлу и имя файла. После этого у вновь созданного объекта мы можем вызвать метод getAbsolutePath() , который вернет полный путь к файлу.

Вывод программы будет примерно таким:

Ручное указание разделителя каталогов

Исключительно в качестве развлечения для решения поставленной задачи можно использовать собственный алгоритм определения разделителя (очень не рекомендуется к применению):

Вывод программы на операционной системе Windows будет примерно таким:

Я пытаюсь понять, как Java разрешает относительный путь при создании объекта File .

Используемая ОС: Windows

Для приведенного ниже фрагмента я получаю IOException , поскольку он не может найти путь:

Насколько я понимаю, Java обрабатывает путь предоставляется как абсолютный и возвращает ошибку, когда путь не существует. Так что это имеет смысл.

Когда я обновляю приведенный выше код для использования относительного пути:

Он создает новый файл и предоставляет следующий вывод:

В этом случае мое предположение , хотя указанный путь не существует, поскольку путь содержит «/../», java обрабатывает его как относительный путь и создает файл в user.dir . Так что это также имеет смысл.

Но если я обновлю относительный путь, как показано ниже:

Тогда я получу IOException: Доступ запрещен.

    , почему «test/../test.txt» обрабатывается как относительный путь и создает файл в «user.dir» , но «test/../../test.txt» возвращает ошибку? Где он пытается создать файл для пути «test/../../test.txt» ?

Когда указанный относительный путь не найден, файл создается в user.dir . Итак, мне кажется, что приведенные ниже два сценария делают одно и то же:

Так есть ли в реальном мире случай, когда можно было бы использовать сценарий 1 вместо сценария 2?

Полагаю, я здесь упускаю что-то очевидное или принципиально неправильно понял относительные пути. Я просмотрел документацию по Java для Файла и не могу найти объяснения этому. В «Переполнении стека» опубликовано довольно много вопросов, касающихся относительных путей, но те, которые я искал, касались конкретных сценариев, а не именно того, как разрешаются относительные пути.

Было бы здорово, если бы кто-то мог объяснить мне, как это работает, или указать на некоторые связанные ссылки?

Вот структура моего проекта:

Мне нужно прочитать config.properties внутри MyClass.java . Я попытался сделать это с относительным путем следующим образом:

Это дает мне следующую ошибку:

Как я могу определить относительный путь в Java? Я использую JDK 1.6 и работаю на Windows.

Попробуйте что-то вроде этого

Итак, ваш новый файл указывает на путь, в котором он создан, обычно в домашней папке вашего проекта.

Оба дают одинаковое значение.

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

если ваш файл находится в OtherSources/Resources

Во-первых, посмотрите на разницу между абсолютным и относительным путями здесь:

Абсолютный путь всегда содержит корневой элемент и полный список каталогов, необходимых для поиска файла.

Кроме того, относительный путь должен быть объединен с другим путем для доступа к файлу.

В конструкторе File (String pathname) класс Javadoc File сказал, что

Имя пути, будь то абстрактное или строковое, может быть абсолютным или относительным.

Если вы хотите получить относительный путь, вы должны определить путь от текущего рабочего каталога до файла или каталога. Попробуйте использовать системные свойства, чтобы получить это. Как изображения, которые вы нарисовали:

Более того, вам следует избегать использования аналогичных символов «.», «../», «/» и других аналогичных по отношению к относительному пути расположения файлов, поскольку при перемещении файлов их сложнее обрабатывать.

Стоит отметить, что в некоторых случаях

не указывает на корневые элементы. Например, когда вы размещаете приложение на диске C: ( C:myApp.jar ), тогда myFolder указывает на (windows)

Вы также можете использовать Path path1 = FileSystems.getDefault(). getPath (System.getProperty( «user.home» ), «downloads», «somefile.txt» );

У меня возникли проблемы с прикреплением скриншотов к ExtentReports с использованием относительного пути к моему файлу изображения. Мой текущий каталог при выполнении «C:Eclipse 64-biteclipseworkspaceSeleniumPractic». При этом я создал папку ExtentReports для файла report.html и image.png, как показано ниже.

Это создает отчет и изображение в папке ExtentReports, но когда отчет открывается и проверяется (пустое) изображение, наведите указатель мыши на изображение. src показывает «Не удалось загрузить изображение» src= «.ExtentReportsQXKmoVZMW7. PNG».

Это решается путем префикса относительного пути и имени файла для изображения с помощью свойства System «user.dir». Таким образом, это работает отлично, и изображение появляется в отчете html.

Пример для Spring Boot. Мой WSDL файл находится в разделе «Ресурсы» в папке «wsdl». Путь к WSDL файлу:

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

Я не собираюсь отвечать на ваш вопрос напрямую, но хочу предложить вам использовать Maven Standard Layout.

Это стандарт Java для организации вашего кода для людей и инструментов сборки.

Оцените статью