Как узнать расположение файла java

Обновлено: 06.07.2024

Я хочу получить доступ к моему текущему рабочему каталогу, используя Java.

Мой вывод неверен, потому что диск C не является моим текущим каталогом.

Как получить текущий каталог?

Вы можете вставить здесь то, что вы видите, когда вы выполняете cd команду в командной строке, когда вы выполняете это? Чего вы пытаетесь достичь, обращаясь к рабочему каталогу? Можно ли это сделать, используя вместо этого путь к классу? Например, если вам нужно прочитать текстовый файл в файловой системе, вы можете легко найти его, когда он находится в пути к классам. В целях отладки рабочий каталог может быть полезен, чтобы узнать, не кажется ли программе доступ к существующим файлам.

Это напечатает полный абсолютный путь от того места, где было инициализировано ваше приложение.

java.io Пакет разрешает относительные пути, используя текущий каталог пользователя. Текущий каталог представлен как системное свойство, то есть user.dir и является каталогом, из которого была вызвана JVM.

@ubuntudroid: именно поэтому я упомянул, что он напечатает путь, с которого приложение инициализировалось. Полагаю, что поток запускает непосредственно jar / программу после запуска командной строки (которая находится в основном в C: \ WINDOWS \ system32). Я надеюсь, вы понимаете мою точку зрения. Предполагая, что вы проголосовали, оцените, что, по крайней мере, вы хотели оставить отзыв. :) user.dir получит путь к папке, в которой запущен процесс. Чтобы узнать фактический путь к главной папке приложения, смотрите мой ответ ниже. Я имею в виду «весь код, который полагается на него, чтобы найти текущий каталог, не работает». Не весь код в целом. (Я должен был @SubOptimal, если пользователь установил -Duser.dir, вероятно, он хочет запустить это в пользовательском рабочем каталоге.

Используя java.nio.file.Path and java.nio.file.Paths , вы можете сделать следующее, чтобы показать, что Java считает вашим текущим путем. Это для 7 и далее, и использует NIO.

Это выводит, Current relative path is: /Users/george/NetBeansProjects/Tutorials что в моем случае, где я запустил класс. Построение путей относительным образом, без использования начального разделителя для указания того, что вы строите абсолютный путь, будет использовать этот относительный путь в качестве начальной точки.

Первый не проверен, но второй фактически получит вашу домашнюю папку. Не текущий рабочий каталог, в котором запущено приложение. Пожалуйста, не путайте домашний каталог пользователя ("user.home", / Users / george в вашем случае) и текущий рабочий каталог ("user.dir", который будет каталогом, из которого вы запустили JVM для вашего приложения). , поэтому может быть что-то вроде, например / Users / george / workspace / FooBarProject). Я предпочитаю этот путь. Когда мне нужен родитель рабочего каталога, это не работает: Paths.get("").getParent() он дает null . Вместо этого работает: Paths.get("").toAbsolutePath().getParent() .

Следующее работает на Java 7 и выше (см. Здесь для документации).

Как это лучше, чем более портативный import java.io.File; File(".").getAbsolutePath() ? Когда вы говорите «портативный», вы имеете в виду, что он работает в Java 6 и более ранних версиях? Paths.get() может считаться лучше тем, что дает прямой доступ к более мощному Path интерфейсу. Каково потенциальное преимущество использования .normalize() в этом контексте? @ OleV.V. От Javadoc: ( нормализовать метод ) Returns a path that is this path with redundant name elements eliminated.

Это даст вам путь вашего текущего рабочего каталога:

И это даст вам путь к файлу с именем «Foo.txt» в рабочем каталоге:

Редактировать: чтобы получить абсолютный путь к текущему каталогу:

* Обновить * Чтобы получить текущий рабочий каталог:

Да, во многих системах это будет ссылка на рабочий каталог. Чтобы получить абсолютный путь, вы можете добавить еще один вызов метода Path path = FileSystems.getDefault().getPath(".").toAbsolutePath(); Вам не нужен foo.txt, просто вставьте пустую строку, чтобы получить каталог В Windows (10) это просто дает мне Path объект, указывающий на файл, вызываемый . внутри текущего рабочего каталога . Используя пустую строку, а не "." работал для меня.

Это решение для меня

Это имеет побочные эффекты, когда вы используете такой объект File в качестве родителя другого файла: новый файл (новый файл (""), "subdir") не будет работать Как определить относительный путь в Java Эта страница помогла мне. Также я предположил, что я должен использовать / при создании относительного пути. Я был неправ, не начинай с / . ../ также работает для перехода в дерево каталогов. @keshlam Это дало мне файл в текущем каталоге под названием . .

Я нашел это решение в комментариях, которое лучше других и более переносимо:

Это точно так же, как ответ от comeGetSome и на самом деле Java <7 way

Что заставляет вас думать, что c: \ windows \ system32 не является вашим текущим каталогом? user.dir Свойство явно быть «текущий рабочий каталог пользователя».

Иными словами, если вы не запускаете Java из командной строки, c: \ windows \ system32, вероятно, является вашим CWD. То есть, если вы дважды щелкаете, чтобы запустить свою программу, CWD вряд ли будет каталогом, из которого вы дважды щелкнете.

Изменить : Похоже, что это верно только для старых версий Windows и / или Java.

Кажется, что это не так, по крайней мере, на моем компьютере с Windows 7, использующим Java 7., user.dir это папка, в которой я дважды щелкнул файл jar. Это возвращает местоположение файла JAR. Не то, что просили. Выдает NPE, когда я запускаю свое приложение из файла JAR, дважды щелкнув по нему. Возвращается, "" если приложение выполняется из файла JAR или элемента CLASSPATH. Не то, что просили. @ Zizouz212 getClass() - это объектный метод, поэтому в статическом контексте просто удаление this не работает. Вы должны были бы явно обратиться к классу, в котором вы находитесь, делая MyClass.class.getClassLoader(). .

как правило, как объект File:

Вы можете захотеть иметь полную квалифицированную строку, такую ​​как "D: / a / b / c", выполняя:

Это хорошо работает в тестах Android, так как Android не включает java.nio.file.Files. Кажется, не работает для меня в статическом контексте (новый File ("") генерирует исключение NullPointerException) . @nsandersen вы, вероятно, использовали неправильный объект File: System.out.println (new java.io.File (""). getAbsolutePath ());

Я использую Linux и получаю одинаковый результат для обоих этих подходов:

В Linux, когда вы запускаете файл jar из терминала , они оба возвращают одно и то же String : "/ home / CurrentUser" , независимо от того, где находится файл jar. Это зависит только от того, какой текущий каталог вы используете со своим терминалом, когда вы запускаете файл JAR.

Если ваш Class с main будет называться MainClass , то попробуйте:

Это будет возвращать String с абсолютным путем в банке файла.

При использовании Windows user.dir возвращает каталог, как и ожидалось, но НЕ при запуске приложения с повышенными правами (запуск от имени администратора), в этом случае вы получаете C: \ WINDOWS \ system32

Я надеюсь, что вы хотите получить доступ к текущему каталогу, включая пакет, т. Е. Если ваша Java-программа включена c:\myApp\com\foo\src\service\MyTest.java и вы хотите печатать до этого c:\myApp\com\foo\src\service момента, вы можете попробовать следующий код:

Примечание. Этот код тестируется только в Windows с Oracle JRE.

Это относится к пунктам 1 и 2. Но если я что-то упустил, вы все еще полагаетесь на путь к классу, указанный в командной строке (т.е. не в переменной окружения), и на «текущий каталог, включающий пакет» ( признайся, я не очень понимаю, что ты имеешь в виду под этим) быть потомком именно первого элемента в classpath. И проблема соответствия случая остается. Извините, если мой комментарий не помог; Я пожертвовал ясностью, чтобы уложиться в лимит комментариев. @ Inversus, он только «отлично работает» в некоторых средах; вам просто посчастливилось проверить это в одном. Написание программного обеспечения, которое терпит неудачу в законных средах выполнения, не является хорошей практикой, даже если ваш набор тестовых сред недостаточно широк, чтобы включать их. @CharlesDuffy Вы правы, это не очень хорошая практика. К счастью, это решение, «решающее мою конкретную проблему», не привело к его «отказу в законных средах выполнения». Фактически, это помогло мне решить такую ​​проблему и написать более надежный код, помимо решения очень специфической проблемы, с которой я столкнулся (которая была лишь отчасти связана с этим вопросом / ответом). Я думаю, мне просто повезло найти его.

Стоит упомянуть, что это только проверено, Windows но я думаю, что оно отлично работает на других операционных системах [ Linux,MacOs,Solaris ] :).

У меня было 2 .jar файла в одном каталоге. Я хотел из одного .jar файла запустить другой .jar файл, который находится в том же каталоге.

Проблема в том, что при запуске его из cmd текущего каталога есть system32 .

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