Как получить путь к каталогу выполнения в java

Я сделал чистую java-приложение, которая рассказывает мне о количестве файлов в данном каталоге. Теперь я устанавливаю текущий каталог, используя следующий код:

`File f = new File(".");`

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

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

Спасибо

Ответ 1

Как говорит Джаррод Роберсон в его ответе здесь:

Одним из способов было бы использовать системное свойство System.getProperty("user.dir"); это даст вам "Текущий рабочий каталог, когда свойства были инициализированы". вероятно, что вы хотите. чтобы узнать, где команда java была выдается в вашем случае в каталоге с файлами для обработки, даже хотя фактический файл .jar может находиться где-то еще на машина. Наличие каталога фактического файла .jar не является полезно в большинстве случаев.

Далее будет распечатана текущая директория, откуда команда была вызвана независимо от того, где .class или .jar файл .class файл.

public class Test
{
    public static void main(final String[] args)
    {
        final String dir = System.getProperty("user.dir");
        System.out.println("current dir = " + dir);
    }
}  

если вы находитесь в /User/me/ и ваш .jar файл, содержащий вышеуказанный код находится в /opt/some/nested/dir/ команда java -jar /opt/some/nested/dir/test.jar Test выведет current dir = /User/me.

Вы также должны в качестве бонуса взглянуть на использование хорошей объектно-ориентированной синтаксический анализатор командной строки. Я настоятельно рекомендую JSAP, Java Простой аргумент. Это позволит вам использовать System.getProperty("user.dir") и, альтернативно, пропустить что-то иначе пережить поведение. Гораздо более удобное решение. Это сделало бы передачу в каталоге очень простой в обработке, и сможете вернуться на user.dir, если ничего не было передано.

Пример: GetExecutionPath

import java.util.*;
import java.lang.*;

public class GetExecutionPath
{
  public static void main(String args[]) {
    try{
      String executionPath = System.getProperty("user.dir");
      System.out.print("Executing at =>"+executionPath.replace("\\", "/"));
    }catch (Exception e){
      System.out.println("Exception caught ="+e.getMessage());
    }
  }
}

вывод для вышеуказанного будет выглядеть как

C:\javaexamples>javac GetExecutionPath.jav

C:\javaexamples>java GetExecutionPath
Executing at =>C:/javaexamples

Ответ 2

Вы можете сделать некоторые сумасшедшие вещи:

String absolute = getClass().getProtectionDomain().getCodeSource().getLocation().toExternalForm();
absolute = absolute.substring(0, absolute.length() - 1);
absolute = absolute.substring(0, absolute.lastIndexOf("/") + 1);
String configPath = absolute + "config/file.properties";
String os = System.getProperty("os.name");
if (os.indexOf("Windows") != -1) {
    configPath = configPath.replace("/", "\\\\");
    if (configPath.indexOf("file:\\\\") != -1) {
        configPath = configPath.replace("file:\\\\", "");
    }
} else if (configPath.indexOf("file:") != -1) {
    configPath = configPath.replace("file:", "");
}

Я использую это, чтобы прочитать конфигурационный файл relativ для пути выполнения. Вы также можете использовать его для получения пути выполнения вашего файла jar.

Ответ 3

Следующие могут помочь вам

  System.getProperty("user.dir")

Это вернет вам путь в виде строки

Ответ 4

Есть несколько разных вещей, которые могут вас заинтересовать:

  • Получить текущий рабочий каталог: String workingDir = System.getProperty("user.dir");

  • Получить путь загрузчика класса: URL resource = classLoader.getResource("/");

Ответ 5

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

Этот каталог называется системным свойством user.dir и обычно является каталогом, в котором была вызвана виртуальная машина Java.

Итак, из этого следует, что оба new File(".") или System.getProperty("user.dir"); возвращают тот же результат. В соответствии с этим вопросом вы работаете в контекстном меню проводника Windows, который, вероятно, немного отличается от обычного вызова JVM.

Что вам нужно сделать, в соответствии с этим учебным пособием, следующее:

  • Создайте новый раздел реестра HKEY_CLASSES_ROOT\Directory\Background\shell. Его имя будет использоваться в контекстном меню Проводника, поэтому дайте ему значение MyJavaApp.
  • Создайте новый раздел реестра HKEY_CLASSES_ROOT\Directory\Background\shell\MyJavaApp и назовите его command. Его значение должно быть полный путь для вашего Java-приложения. Вы можете добавить %1 в команду в качестве заполнителя для текущего выбранного файла/каталога. Это означает, что ваша программа будет вызвана одним дополнительным аргументом.
  • Ваша программа может прочитать дополнительный аргумент, чтобы определить, из какого каталога он был вызван.

Обратите внимание, что приведенные выше шаги (и учебники) предназначены для Windows Vista, поэтому вам может потребоваться дважды проверить, что это также работает для Windows 8.