Как узнать path файла java

Обновлено: 05.07.2024

Я пытаюсь найти способ получить абсолютный путь к папке ресурсов в моем тесте junit.

Я сомневаюсь, не ли получить файл в папке ресурсов (теперь я знаю, как это сделать), а получить путь к папке ресурсов.

Например, если мой файл в папке ресурсов имеет такую ​​структуру:

Я бы хотел получить местоположение /opt/project/view/api/target/classes/ без использования чего-то уродливого, например:

Идея состоит в том, чтобы иметь такой метод, как this.getClass().getResourcesPath() , но такого метода не существует.

4 ответа

Если у кого-то «возникнет этот вопрос», может возникнуть долгая философская дискуссия о плюсах и минусах. Но если вы натолкнетесь на это тоже, как я, то это может быть выходом, если вы хотите сделать это в текущем стиле Java (предположение: вы file_in_resources.txt находится внутри соответствующей стандартной папки Unittest src / test / resources):

В этом решении используются новейшие API-интерфейсы Java из NIO.2 (см. учебные пособия по Oracle ) вроде

И некоторая часть API потока Java 8 для чтения содержимого файлов в строку (вы можете изменить эту часть, как хотите :)).

Является ключевым моментом - он прозрачно предоставляет вам текущий рабочий каталог, какую бы ОС (Windows, Linux, MacOS) вы не использовали.

Если вы являетесь пользователем Spring, все будет еще проще! См. так ответьте здесь.

Если ваш тестовый класс находится в той же папке ресурсов, вы можете попробовать:

Если папка ресурсов не совпадает, вы можете перейти к ней в зависимости от ее относительного местоположения, взяв за точку отсчета местоположение тестового класса (полученного с использованием приведенного выше кода).

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

За основу данной статьи была взята информация из 9-ой главы книги «Oracle Certified Professional Java SE 7 Programmers Exams 1Z0-804 and 1Z0-805». Она была немного изменена (кое-где обрезана, а кое-где дополнена с помощью Google и Википедии). Здесь показаны далеко не все возможности NIO — для более подробной информации следует обратиться к официальной документации. Приятного прочтения.

Немного терминологии

Интерфейс программирования приложений (иногда интерфейс прикладного программирования) (англ. application programming interface, API) — набор готовых классов, процедур, функций, структур и констант, предоставляемых приложением (библиотекой, сервисом) для использования во внешних программных продуктах.

I/O (input/output, Ввод-вывод ) — взаимодействие между обработчиком информации и её поставщиком и/или получателем. Ввод — сигнал или данные, полученные обработчиком, а вывод — сигнал или данные, посланные им (или из него).

NIO ( /*в контексте Java*/ Non-blocking I/O, New I/O) — коллекция прикладных программных интерфейсов для языка Java, предназначенных для реализации высокопроизводительных операций ввода-вывода. Также встречается аббревиатура NIO.2 – она относится к нововведениям относительно этого направления в Java 7.

Символьная ссылка (Symbolic link, симлинк) — специальный файл в файловой системе, содержащий только текстовую строку с указателем. Эта строка трактуется как путь к файлу, который должен быть открыт при попытке обратиться к данному файлу.

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

Относительный путь — это путь по отношению к текущему рабочему каталогу.

Немного истории

Изначально Java предоставляла класс File (в пакете java.io) для доступа к файловым системам. Этот класс представляет файл/каталог в файловой системе и позволяет выполнять такие операции, как проверка на существование файла/каталога, получении свойств, и удаление файла/каталога. Тем не менее, первый вариант API не был достаточен для удовлетворения потребностей разработчиков. Ощущалась явная необходимость доработки I/O API.

Краткий список недостатков первой I/O API:

  • Классу File не хватало функциональности. Например не было метода copy для копирования файла/каталога.
  • В классе File определено много методов, которые возвращают Boolean-значение. В случае ошибки, возвращалось false, а не бросалось исключение, что затрудняло обнаружение и исправление ошибок.
  • Класс File не предоставляет хорошей обработки символьных ссылок.
  • Класс File обрабатывает файлы/каталоги неэффективно (проблемы с масштабированием);
  • Класс File предоставляет доступ к ограниченному набору атрибутов файлов, который зачастую недостаточен.

Для преодоления этих проблем, в Java 4 введен NIO (New IO). Ключевые особенности NIO:

В Java 7 был введён пакет java.nio.file для лучшей поддержки и обработки символьных ссылок, полного доступа к атрибутам и работы с файловой системой через интерфейсы или классы, такие как Path, Paths, and Files.

Использование интерфейса Path

Java 7 представляет новую абстракцию для пути, а именно интерфейс Path. Он используется в новых функциях и API, по всему NIO.2. Объект пути содержит имена каталогов и файлов, которые составляют полный путь до файла/каталога, представленного объектом Path; Path содержит методы для извлечения элементов пути, манипуляций с ними и их добавления.

Ниже приведён пример кода, для выполнения на Unux-системе, но пользователи Windows могут раскомментировать одну строку и закомментировать другую, для выполнения примера на своих машиах (см. комментарии в коде). Существование соответствующих файлов и катологов (test и testfile.txt) в файловой системе не обязательно. В этом примере создаётся объект Path и извлекается основная информация, связанная с ним:

Вывод получается такой:

  • Сначала создаётся объект класса Path, с использованием метода get () класса. Данный метод принимает строку, содержащую путь.
  • Обратите внимание на использование управляющего символа '\' в Paths.get("D:\\test\\testfile.txt") для Windows-систем. Без него '\t' будет интерпретироваться как символ табуляции, что приведёт к java.nio.file.InvalidPathException при запуске программы, т.к. символы табуляции не могут содержаться в путях. (На мой взгляд пути Linux-систем более удобны для программистов, т.к. используют символ слэша, не требующий экранирования.)
  • Затем происходит извлечение имени файла с использованием метода getFilename() объекта Path
  • Далле используется метод getRoot() для получения корневого элемента объекта Path и метод getParent() для получения родительской директории целевого файла.
  • В конце данного примера происходит обход елементов пути с помощью цикла foreach. Как альтернативу можно использовать обычный цикл и методы getNameCount() (для получения числа элементов в пути) и getName(index) (для получения элемента по индексу).

Перейдём к другому примеру который включает получение абсолютного пути от относительного пути и нормализацию пути:

  • Метод toUri() возвращает URI (путь который может быть открыт из браузера).
  • Метод toAbsolutePath() возвращает абсолютный путь от данного относительного пути. В случае, если был введён абсолютный путь, метод вернёт его же.
  • Метод normalize() выполняет нормализацию пути, другими словами удаляет ненужные символы (такие как “ . ” и “ .. ”) из объекта Path.
  • Метод toRealPath () возвращает абсолютный путь от полученного пути (как toAbsolutePath ()) и нормализует его (как normalize()). Кроме того, если все параметры выбраны правильно, то он может даже работать с символьными ссылками. Однако, для этого метода необходимо, чтобы конечный файл/каталог существовал в файловой системе (это не является обязательным условием для других методов Path).

Пример вывода при выполнении данного кода (файл Test не должен существовать в файловой системе для аналогичного вывода):

(Пользователи Windows-систем получат sun.nio.fs.WindowsException.translateToIOException вместо sun.nio.fs.UnixException.translateToIOException и т. д. и т.п.)

Пример вывода при выполнении данного кода (файл Test должен существовать в файловой системе для аналогичного вывода):

Интерфейс Path содержит два метода для сравнения объектов Path: equals() and compareTo(). Метод equals() сравнивает пути и возвращает Boolean. Метод compareTo() сравнивает пути посимвольно и возвращает: 0, если пути равны; отрицательное целое значение, если путь в объекте вызывающем метод лексикографически меньше пути в объекте, переданном в качестве параметра; положительное целое значение в противоположном случае.

Последний System.out.println является подсказкой — он выводит путь, который должен быть передан в path2 для аналогичного вывода. Вывод должен получится такой:

Использование класса Files

Рассмотрим класс Files (введён в Java 7, находится в пакете java.nio.file), который можно использовать для выполнения различных операций с файлами и каталогами. Files является служебным классом, это означает, что это final-класс с private-конструктором и содержит только статические методы. В этом классе находится множество методов для выполнения различных действий. Рассмотрим некоторые из них.

Выше был показан пример кода, в котором выяснялось, указывают ли два пути на один файл. Сущесвует способ проверить это с помощью метода isSameFile () из класса Files:

Т.к. тут сравниваются файлы, а не пути, то существование соответствующего файла обязательно (см. подсказку для пути в предыдущем примере) иначе будет получена ошибка java.nio.file.NoSuchFileException.

В случае, если файл по указанному адресу существует, получим такой вывод:

Можно определить, имеем мы дело с файлом или директорией (папкой) с помощью метода isDirectory() класса Files и проверить их существование с помощью метода exists():

Вывод должен получится примерно такой (выбирайте пути в соответствии с вашей ОС и расположением файлов):

Интересный вывод можно получить, если написать Path path = Paths.get("/"); для Unix-систем или Path path = Paths.get("С:\\"); для Windows-систем, т.е. если передать в качестве параметра имя корневого котолога:

Для корневого каталога path.getFileName() возвращает null.

Класс Files содержит методы isReadable(), isWriteable() и isExecutable() для проверки возможности чтения, записи и выполнения файлов:

Метод getAttribute() позволяет получить свойства (атрибуты) файла. Метод принимает переменное число параметров: первый — объект Path; второй — имя атрибута; далее от нуля до нескольких значений LinkOption (это enum):

Коппирование файлов

Теперь рассмотрим коппирование файла/диретории. Для этого используем метод Files.copy(). Сигнатура данного метода:

Path copy(Path source, Path target, CopyOption. . . options)

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

После первого запуска всё должно отработать корректно для корректных путей. Но если данный код без изменений скомпилировать и выполнить повторно, то будет получено исключение java.nio.file.FileAlreadyExistsException. Оно связано с тем, что целевой файл уже существует. Для избежания таких проблем можно указать, чтобы в случае его существования он перезаписывался. Для этого надо немного изменить одну строку кода:

Перемещение файла

Метод для перемещения файла очень похож на метод для копирования:

Path move(Path source, Path target, CopyOption. . . options)

Значения передаваемых параметров совпадают по смыслу. Пример кода отличается от предыдущего минимально:

Если при копировании директории содержащиеся в ней файлы и директории не копировались, то при её перемещении, в случае отсутствия ошибок, перемещается и всё содержимое.

Удаление файла

Посмотрим на пример кода:

Несколько моментов, которые необходимо помнить относительно метода Files.delete():

  • В случае удаления каталога, необходимо, чтобы он был пустым, иначе будет получено исключение (java.nio.file.DirectoryNotEmptyException)
  • Если передать в данный метод символьную ссылку, то будет удалена ссылка, а не целевой файл.
  • Для данного метода необходимо, чтобы файл существовал, иначе будет получено исключение (java.nio.file.NoSuchFileException) . Если необходимо игнорировать данные случаи, то лучше подойдёт метод deleteIfExists(), который удаляет файл в случае его существования и не бросает подобное исключение при его отсутствии.

Обход дерева файлов

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

Оба метода принимают путь, с которого начнётся обход дерева и экземпляр типа FileVisitor, который будет определять поведение при обходе дерева. Второй метод имеет два дополнительных параметра: Set, содержащий опции обхода, и максимальную глубину. Максимальная глубина определяет, насколько уровней каталогов будет происходить обход. Если в её качестве указать 0, то будет рассматриваться только указанный файл, а если указать MAX_VALUE, то будут пройдены все подкаталоги.

FileVisitor — это интерфейс, содержащий следующие методы:

  • FileVisitResult preVisitDirectory(T dir, BasicFileAttributesattrs) — выполняется перед достуом к элементам каталога.
  • FileVisitResult visitFile(T file, BasicFileAttributes attrs) — выполняется при доступе к файлу.
  • FileVisitResult postVisitDirectory(T dir, IOException exc) — выполняется, когда все элементы директории пройдены .
  • FileVisitResult visitFileFailed(T file, IOException exc) — выполняется, если к файлу нет доступа.

Вам необходимо реализовать интерфейс FileVisitor, чтобы передать соответствующий объект в метод walkFileTree(). Но если необходимости реализовывать все четыре метода этого интерфейса нет, то можно просто расширить реализацию класса SimpleFileVisitor, переопределив лишь необходимые методы.

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

  • Объявляется класс MyFileVisitor, унаследованный от SimpleFileVisitor, в котором переопределены два метода: visitFile() (для вывода имени файла) и preVisitDirectory() (для вывода имени директории).
  • Вызывается walkFileTree() в который передаётся объект MyFileVisitor.
  • Метод walkFileTree() начинает выполнение с переданного в него каталога. При этом вызывается метод visitFile() при каждом проходе файла, preVisitDirectory() — перед просмотром элементов директории, postVisitDirectory() — после просмотра элементов директории, visitFileFailed() — в случае отсутствия доступа к файлу/дириктории.
  • Из этих четырёх методов были переопределены только два для вывода имён каталогов и файлов.
  • Можно контролировать поток обхода с помощью возвращаемых этими методами значений (enum FileVisitResult). Их четыре:
    1. CONTINUE: указывает на то, что обход дерева следует продолжить.
    2. TERMINATE: указывает, что обход нужно немедленно прекратить.
    3. SKIP_SUBTREE: указывает, что подкаталоги должны быть пропущены для обхода.
    4. SKIP_SIBLINGS: указывает на то, что обход должен быть остановлен в текущем каталоге и каталогах одного уровня с ним. Если это значение возвращается из preVisitDirectory(), то вложенные файлы/каталоги не обходятся и postVisitDirectory() не срабатывает. Если это значение возвращается из visitFile (), то остальные файлы каталога не обходятся. Если он возвращается из postVisitDirectory (), то остальные каталоги того же уровня не будут обходиться.

Доработка копирования файлов

Возвращаясь к «глупому» копированию каталога в котором что-то есть — используя полученные знания можно реализовать его более логично, относительно результата, ожидаемого пользователем:

В методе preVisitDirectory() происходит копирование посещаемого каталога и аналогично копируется файл в методе visitFile(). Чтобы получить новый путь назначения, используется метод relativize() из класса Path.

Поиск файлов

Поняв принципы обхода дерева файлов, можно легко организовать поиск нужного файла. При поиске конкретного файла/каталога можно проверять соответствие имени файла/каталога с искомым с помощью метода visitFile () или preVisitDirectory (). Однако, если необходимо найти все файлы, соответствующие некоторому шаблону (например, все исходные файлы Java или XML-файлы ), то лучше использовать использовать универсальный символ (glob) или регулярное выражение (regex). Тут пригодится интерфейс PathMatcher. Данный интерфейс реализован для каждой файловой системы и вы можете получить экземпляр этого типа из класса FileSystem используя метод getPathMatcher().

Перед тем, как перейти к примеру стоит пояснить шаблоны Glob (похожи на regex, но немного проще. Если понятие regex для Вас ново, то ближе с ним можно ознакомится здесь — Регулярные выражения в Java). В таблице ниже приведены шаблоны, поддерживаемые glob-синтаксисом:

Шаблон Описание
* Соответствует любой строке любой длины, даже пустой.
** Как и *, но выходит за границы каталогов.
? Любой одиночный символ.
[XYZ] Либо X, либо Y, либо Z.
5 Соответствует любому символу от 0 до 5.
[a–z] Любой строчный символ латинского алфавита.
Либо XYZ или ABC.

Ниже приведён пример кода, который находит все java-файлы в указанном каталоге. Для поиска используется glob-шаблон, но в коментариях приведён regex-шаблон, который можно использовать для этой же цели. Обратите внимание, что в строке с шаблоном сначала указывается его тип (glob или regex), потом ставится доеточие, а потом пишется сам шаблон. Ради интереса можете запустить этот же код убрав первую часть с двоеточием, но сначала просто попробуйте скомпилировать и выполнить:

Отслеживание изменений в каталоге

Предположим, что необходимо написать некое приложение, работающее с файлами (IDE, файловый менеджер или какой-либо редактор). Допустим какой-либо файл, важный для приложения был либо создан, либо изменён, либо удалён из вне и надо сообщить об этом пользователю.

Java 7 предоставляет сервис для слежения за каталогами. Вы можете зарегистрировать в нём каталог, чтобы получать уведомления о любом изменении в каталоге (создание, изменение и удаление файла).

Рассмотрим API этого сервиса на примере. Для этого примера используйте каталог в котором при выполнении программы в бесконечном цикле Вы будете создавать, изменять и удалять файлы — действия должны выводится на консоли. Код ниже:

Пояснения к коду:

  • Получение экземпляра WatchService осуществляется через вызов метода newWatchService() из класса FileSystem, который в свою очередь был получен из объекта класса Path через вызов метода getFileSystem(). Но его (экземпляр FileSystem) можно получить и через вызов метода getDefault() из класса FileSystems, т.е. можно заменить watchService = path.getFileSystem().newWatchService();
    на
    watchService = FileSystems.getDefault().newWatchService();
  • Далее происходит регистрация каталога на данном сервисе. Из объекта Path можно вызвать два метода register(), которые различаются принимаемыми параметрами. В нашем случае — это метод принимающий объект сервиса и переменное число параметров, определяющих отслеживаемые события.
  • OVERFLOW указывает, что несколько уведомлений о событиях были отброшены или пропущены. ENTRY_CREATE, ENTRY_DELETE, ENTRY_MODIFY соответствуют созданию, редактированию и удалению.
  • В цикле происходит ожидание события. Здесь можно использовать три метода для уведомления:
    • Метод poll() возвращает ключи очереди, если они есть, в противном случае сразу завершается.
    • Метод poll(long, TimeUnit) возвращает ключи очереди, если они есть, в противном случае ждёт указанное число единиц времени.
    • Метод take() возвращает ключ очереди, если он доступен, иначе ждёт, пока он не будет доступен.

    Основное различие между poll() и take() в том, что poll() это неблокирующий вызов, а take() — блокирующий.

    Когда ключ возвращается, то одно или более событий могут быть помещены в очередь, именно поэтому используется ещё один цикл (для перебора всех событий).

    Мой код работает внутри файла JAR, скажем, foo.jar , и мне нужно знать, в коде, в какой папке находится запущенный файл foo.jar .

    Так что, если foo.jar находится в C:\FOO\ , я хочу получить этот путь независимо от того, каков мой текущий рабочий каталог.

    Посмотрите ответ Fab для решения, которое работает, когда пути включают пробелы. Также обратите внимание, что некоторые ответы ниже касаются вопроса в заголовке (путь к jar), некоторые - к самому вопросу (путь к папке, содержащей jar), а некоторые предоставляют пути к классам внутри файла jar. Осторожно при использовании в ANT! ============== Я называю String path = SomeClass.class.getProtectionDomain (). GetCodeSource (). GetLocation (). GetPath (); и получить: /C:/apache-ant-1.7.1/lib/ant.jar Не очень полезно! Интересно. Оригинальный код, в котором я это использовал, никогда не запускался в ant, поэтому для меня это не проблема. @Dino Fancellu, я испытал именно то, что вы описали. Работает во время разработки, не работает при сборке.

    Замените «MyClass» на имя вашего класса.

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

    Этот toURI() шаг жизненно необходим, чтобы избежать проблем со специальными символами, включая пробелы и плюсы Правильный однострочный: return new File(MyClass.class.getProtectionDomain().getCodeSource().getLocation().toURI()); использование URLDecoder не работает для многих специальных символов. Смотрите мой ответ ниже для более подробной информации. Примечание: это возвращает путь, включая имя файла jar Разве это не указывает на файл jar, а не на работающий каталог? Вам нужно будет сделать результат getParentFile () для этой работы. Кроме того, getProtectionDomain имеет значение null, если вы получаете свой класс от трассировки: val strace = Thread.currentThread().getStackTrace; val path = strace(1).getClass.getProtectionDomain Использование этого метода до Java 8; поместив этот метод в класс, который находится во внешнем Jar-файле, загруженном через class-path, тогда будет указан путь внешнего jar-файла вместо действующего Jar-файла.

    Лучшее решение для меня:

    Это должно решить проблему с пробелами и специальными символами.

    Еще одно примечание: при вызове этой функции из Jar, имя jar добавляется в конце для меня, поэтому пришлось выполнить: path.substring (0, path.lastIndexOf ("/") + 1); / не обязательно разделитель пути. Вы должны сделать (новый файл (путь)). GetParentFile (). GetPath () вместо этого. Здесь нет проблем с добавлением имени файла JAR. UTF-преобразование кажется идеальным решением в сочетании с @Iviggiani one's ( URLDecoder.decode(ClassLoader.getSystemClassLoader().getResource(".").getPath(), "UTF-8"); ) в Linux. Тем не менее, я не пробовал на Windows. Спасибо, это позволило мне загружать файлы, внешние по отношению к моему JAR, с помощью FileInputStream как в Linux, так и в Windows. Просто нужно было добавить расшифрованный путь перед именем файла . Осторожно: не рекомендуется использовать URLDecoder для декодирования специальных символов. В частности, символы like + будут ошибочно декодированы в пробелы. Смотрите мой ответ для деталей.

    Чтобы получить File для данного Class , есть два шага:

    1. Преобразовать Class в а URL
    2. Преобразовать URL в а File

    Важно понимать оба шага, а не объединять их.

    Если у вас есть File , вы можете позвонить, getParentFile чтобы получить содержащую папку, если это то, что вам нужно.

    Шаг 1: Class в URL

    Как обсуждалось в других ответах, есть два основных способа найти URL отношение к Class .

    URL url = Bar.class.getProtectionDomain().getCodeSource().getLocation();

    URL url = Bar.class.getResource(Bar.class.getSimpleName() + ".class");

    У обоих есть плюсы и минусы.

    getProtectionDomain Подход дает основание расположение класса (например, содержащий JAR - файл). Однако, возможно, что политика безопасности среды выполнения Java сработает SecurityException при вызове getProtectionDomain() , поэтому, если ваше приложение должно работать в различных средах, лучше всего протестировать во всех них.

    getResource Подход дает полный путь URL ресурса класса, из которого вам нужно будет выполнить дополнительные манипуляции со строками. Это может быть file: путь, но он также может быть jar:file: или даже чем-то более неприятным bundleresource://346.fwk2106232034:4/foo/Bar.class при выполнении в рамках OSGi. И наоборот, getProtectionDomain подход правильно дает file: URL, даже из OSGi.

    Обратите внимание, что оба getResource("") и getResource(".") потерпели неудачу в моих тестах, когда класс находился в файле JAR; оба вызова вернули ноль. Поэтому я рекомендую вызов №2, показанный выше, так как он кажется более безопасным.

    Шаг 2: URL чтобы File

    В любом случае, если у вас есть URL , следующим шагом будет преобразование в File . Это его собственная проблема; см. подробности в блоге Kohsuke Kawaguchi об этом , но вкратце вы можете использовать его, new File(url.toURI()) если URL-адрес полностью сформирован.

    Наконец, я бы очень не рекомендовал использовать URLDecoder . Некоторые персонажи URL, : и , / в частности, не являются допустимыми URL-кодированных символов. От URLDecoder Javadoc:

    Предполагается, что все символы в закодированной строке являются одним из следующих: от "a" до "z", от "A" до "Z", от "0" до "9" и "-", "_", " .", а также "*". Символ "%" разрешен, но интерпретируется как начало специальной экранированной последовательности.

    .

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

    На практике, URLDecoder как правило, не бросать, IllegalArgumentException как угрожали выше. И если ваш путь к файлу имеет пробелы, закодированные как %20 , этот подход может работать. Однако, если в вашем пути к файлу есть другие не алфавитные символы, например, у + вас будут проблемы с URLDecoder указанием пути к файлу.

    here is the structure of my project

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

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

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

    ОТВЕТЫ

    Ответ 1

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

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

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

    Ответ 2

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

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

    Ответ 3

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

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

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

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

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

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

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

    Ответ 4

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

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

    Ответ 5

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

    Ответ 6

    У меня возникли проблемы с прикреплением скриншотов к ExtentReports с использованием относительного пути к моему файлу изображения. Мой текущий каталог при выполнении "C:\Eclipse 64-bit\eclipse\workspace\SeleniumPractic". При этом я создал папку ExtentReports для файла report.html и image.jpg, как показано ниже.

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

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

    Ответ 7

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

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

    Ответ 8

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

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

    Читайте также: