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

Допустим, у меня есть мой основной класс в C:\Users\Justian\Documents\. Как я могу заставить свою программу показывать это в C:\Users\Justian\Documents?

Жесткое кодирование не является option-, его нужно адаптировать, если оно перемещено в другое место.

Я хочу поместить кучу файлов CSV в папку, чтобы программа распознала все файлы, затем загрузила данные и манипулировала ими. Я действительно просто хочу знать, как перейти к этой папке.

Ответ 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 Argument Parser. Это позволит вам использовать System.getProperty("user.dir") и, напротив, передать что-то еще, чтобы пережить поведение. Гораздо более удобное решение. Это сделало бы переход в каталог очень простым в обработке и сможет вернуться на user.dir, если ничего не было передано.

Ответ 2

Используйте CodeSource#getLocation(). Это отлично работает и в файлах JAR. Вы можете получить CodeSource ProtectionDomain#getCodeSource(), а ProtectionDomain в свою очередь можно получить Class#getProtectionDomain().

public class Test {
    public static void main(String... args) throws Exception {
        URL location = Test.class.getProtectionDomain().getCodeSource().getLocation();
        System.out.println(location.getFile());
    }
}

Обновить в соответствии с комментарием OP:

Я хочу сбросить кучу CSV файлов в папку, программа распознает все файлы, затем загружает данные и манипулирует ими. Я просто хочу знать, как перейти к этой папке.

Это потребует жесткого кодирования/знания их относительного пути в вашей программе. Скорее рассмотрим добавление своего пути к пути к классам, чтобы вы могли использовать ClassLoader#getResource()

File classpathRoot = new File(classLoader.getResource("").getPath());
File[] csvFiles = classpathRoot.listFiles(new FilenameFilter() {
    @Override public boolean accept(File dir, String name) {
        return name.endsWith(".csv");
    }
});

Или передать свой путь как аргумент main().

Ответ 3

File currentDirectory = new File(new File(".").getAbsolutePath());
System.out.println(currentDirectory.getCanonicalPath());
System.out.println(currentDirectory.getAbsolutePath());

Распечатывает что-то вроде:

/path/to/current/directory
/path/to/current/directory/.

Обратите внимание, что File.getCanonicalPath() выдает проверенное исключение IOException, но оно удалит такие вещи, как ../../../

Ответ 4

this.getClass().getClassLoader().getResource("").getPath()

Ответ 5

Я только что использовал:

import java.nio.file.Path;
import java.nio.file.Paths;

...

Path workingDirectory=Paths.get(".").toAbsolutePath();

Ответ 6

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

String internalPath = this.getClass().getName().replace(".", File.separator);
String externalPath = System.getProperty("user.dir")+File.separator+"src";
String workDir = externalPath+File.separator+internalPath.substring(0, internalPath.lastIndexOf(File.separator));

Ответ 7

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

Так что же вы на самом деле хотите сделать? Вероятно, есть способ сделать это, что не делает предположений о том, откуда взялись классы.

Ответ 8

Если вы хотите получить свой текущий рабочий каталог, используйте следующую строку

System.out.println(new File("").getAbsolutePath());

Ответ 9

Текущий рабочий каталог означает корневую папку вашего текущего проекта Java.

public class CurrentWorkingDirectory {

    public static void main (String args[]) {

        String cwd = System.getProperty("user.dir");
        System.out.println("Current working directory : " + cwd);

    }
}

Выход:

Current working directory: C:\workspace\Java4Testers