Как указать путь к файлу в java

Обновлено: 05.07.2024

Я создал Java-приложение для «Debian Linux». Теперь я хочу, чтобы это приложение читало файл, помещенный в каталог, в котором указан файл jar этого приложения. Так что же указывать в аргументе файлового объекта?

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

Если вы знаете имя файла, конечно, это просто

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

Вы спрашиваете о проблемах с побегом?

Если это так, используйте косую черту вместо обратной, например

Использование относительных путей в java.io.File полностью зависит от текущего рабочего каталога. Это отличается от способа выполнения JAR. Если вы, например, находитесь в /foo и выполняете JAR с помощью java -jar /bar/jar/Bar.jar , то рабочим каталогом по-прежнему будет /foo . Но если вы cd на /bar/jar и выполните java -jar Bar.jar , то рабочий каталог будет /bar/jar .

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

Это возвращает корневой путь к файлу JAR (т.е. корень пути к классам). Если вы разместите свой ресурс относительно корня пути к классам, вы можете получить к нему доступ следующим образом:

В качестве альтернативы вы также можете просто использовать:

Я думаю, это должно помочь:

Таким образом, файл будет найден в свойстве user.dir , которое будет рабочим каталогом вашего приложения.

Вы можете попросить загрузчик классов указать местоположение банки:

. но я бы посоветовал поместить файл, который вы ищете, внутрь вашего jar-файла и прочитать его как ресурс ( getClass().getResourceAsStream( "myFile.txt" ) ).

В IntelliJIDEA щелкните файл правой кнопкой мыши, затем скопируйте абсолютный путь, затем в двойной кавычке вставьте путь как filePath. например, это должно быть примерно так:

Можно прописать абсолютный путь к файлу, скажем вот так:

Насколько я понимаю, так делать совсем плохо, ибо мы не знаем, куда пользователь сохранит нашу программу.

Можно прописать относительный путь к файлу, скажем вот так:

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

То JVM будет искать файл по такому расположению:

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

Можно делать что-то вообще интересное и непростое, типа такого:

Здесь поиск файла будет происходить из пакета, где находится класс this.getClass() . (т.е. та самая "конкатенация" происходит с путём к пакету класса)

Но ведь наверное плохо мешать файлы классов с файлами ресурсов?

Здесь поиск файла происходит в директориях classpath . Но по идее, тогда может оказаться несколько подходящих файлов? И что же это будет?!

В общем вопросы: Правильно ли то, что я написал? Какие ещё способы существуют? Когда какой способ использовать? Какой способ наилучший (если он существует)?

723 1 1 золотой знак 7 7 серебряных знаков 23 23 бронзовых знака intellij idea лучше всего так Run -> Edit configuration -> working derictory(указать рабочую директорию) Хранить изображения и другие ресурсы не нуждающиеся в редактировании внутри JAR - нормальная практика. Обычно создают отдельный каталог images на одном уровне с корнем пакета, либо копируют его туда при сборке JAR.

Общим ответом на это будет просто слово "зависит" - главный вопрос в том, с чем вы работаете. Как правило, java-приложения распространяются в виде jar-архивов, и если у вас есть распространяемые с приложением ресурсы (например, иконки), то они должны либо оказаться именно там, среди классов, либо, если вы распространяете приложение в виде архива и отдельных ресурсов снаружи архива, то вам нужно самому находить расположение jar-файла и вручную восстанавливать путь к ресурсом по аналогии с working directory. В случае, если вы пишете некоторую утилиту, которая обрабатывает аргументы, то вам, скорее всего, придется иметь дело из абсолютными, и с относительными путями - если вы пишете, скажем, ресайзер изображений, то вызов java -jar path/resizer.jar image.jpg 300x400 потребует простого проброса аргумента внутрь ImageIcon напрямую, без вообще какого-либо анализа.

Другими словами, все описанные методы имеют свое применение, и являются более или менее предпочтительными в зависимости от ситуации; каждый из них не чем-то плох, а неприменим в текущей ситуации. Если вопрос заключается в поиске ресурсов приложения, то лучше всего либо закидывать в jar, либо искать место установки приложения и отсчитывать от него (т.к. working dir может оказатсья любым).

Путь к файлу Java, Путь к файлу в Java, абсолютный путь к файлу Java getAbsolutePath, Канонический путь к файлу Java getCanonicalPath, абстрактный путь к примеру кода getPath.

Сегодня мы рассмотрим путь к файлу Java. Путь к файлу Java может быть абстрактным, абсолютным или каноническим.

Путь к файлу Java

java.io.Файл содержит три метода определения пути к файлу, мы рассмотрим их в этом руководстве.

    getPath() : Этот метод пути к файлу возвращает абстрактный путь в виде строки. Если строковый путь используется для создания файла объекта, он просто возвращает аргумент pathname. Если в качестве аргумента используется URI, то он удаляет протокол и возвращает имя файла.

getAbsolutePath() : Этот метод пути к файлу возвращает абсолютный путь к файлу. Если файл создан с абсолютным путем, он просто возвращает путь.

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

В системах Microsoft Windows относительный путь становится абсолютным путем его сопоставления с текущим каталогом диска, названного путем, если таковой имеется; если нет, он сопоставляется с текущим каталогом пользователя.

getCanonicalPath () : Этот метод пути возвращает канонический путь, который является как абсолютным, так и уникальным. Этот метод сначала преобразует это имя пути в абсолютную форму, если это необходимо, как если бы он вызывал метод getAbsolutePath, а затем сопоставляет его с его уникальной формой зависящим от системы способом.

Пример Пути к файлу Java

Давайте рассмотрим различные варианты пути к файлу в java с помощью простой программы.

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

Результат понятен сам по себе. Исходя из выходных данных, использование канонического пути лучше всего подходит, чтобы избежать каких-либо проблем из-за относительных путей.

Также обратите внимание, что методы пути к файлу java не проверяют, существует файл или нет. Они просто работают с именем пути к файлу, используемому при создании объекта File. Это все для разных типов пути к файлу в java.

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

В ранних версиях Java для работы с файлами использовались классы типа File и FileInputStream . Но теперь класс File считается устаревшим, и использовать его не рекомендуется. Вы, конечно, можете еще встретить его в коде, параметрах методов или конструкторах классов.

Мы будем начинать изучение работы с файлами сразу с класса Path . Path — это класс, который пришел на смену File . Работа с ним безопаснее и эффективнее.

Класс Path

Технически Path — это не класс, а интерфейс. Так сделано для того, чтобы можно было под каждую операционную (и файловую) систему писать свой класс-наследник Path .

У Windows свои стандарты написания пути файлов, у Linux — свои. А ведь в мире еще много операционных систем, и у каждой — свои стандарты.

Поэтому везде в методах для работы с файлами указан интерфейс Path , а реально работа идет с его классами-наследниками: WindowsPath , UnixPath , .

Создание объекта Path

Чтобы создать объект Path (на самом деле это будет объект класса-наследника — WindowsPath ), нужно воспользоваться командой вида:

Где имя — это имя переменной типа Path . путь — это путь к файлу (или директории) вместе с именем файла (или директории). А of — статический метод класса Path .

Метод of() используется для того, чтобы создать объекты типа WindowsPath если программа запускается под Windows, а если программа запускается под Linux — объекты UnixPath . Вы не можете создать объект типа Path с помощью кода вида new Path() .

Код Примечание
Путь к файлу
Путь к директории

Файл (или директория) не обязаны существовать, чтобы мог существовать валидный объект типа Path . Может вы только хотите создать файл. Объект типа Path — это как продвинутая версия типа String — он не привязан к конкретному файлу на диске: он просто хранит некий путь на диске и все.

2. Методы типа Path

У интерфейса Path есть довольно много интересных методов. Самые интересные представлены в таблице ниже.

Метод Описание
Возвращает родительскую директорию
Возвращает имя файла без директории
Возвращает корневую директорию из пути
Проверяет, что текущий путь — абсолютный
Преобразует путь в абсолютный
Убирает шаблоны в имени директории.
Строит новый абсолютный путь из абсолютного и относительного.
Получает относительный путь из двух абсолютных путей.
Проверяет, что текущий путь начинается с пути
Проверяет, что текущий путь заканчивается на путь
Дробит путь на части с помощью разделителя / .
Возвращает количество частей.
Дробит путь на части с помощью разделителя / .
Возвращает часть по ее номеру.
Дробит путь на части с помощью разделителя / .
Возвращает часть пути, заданную интервалом.
Преобразует объект Path в устаревший объект File
Преобразует объект Path в объект типа URI

Ниже идет краткое описание существующих методов.

3. Разделение пути на части

Метод getParent() возвращает путь, который указывает на родительскую директорию для текущего пути. Независимо от того, был этот путь директорией или файлом:

Метод getFileName() возвращает одно имя файла (или директории) — то, что идет после последнего разделителя:

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