Как получить текущий рабочий каталог в Java? - PullRequest
108 голосов
/ 01 июля 2010

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

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

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

Ответы [ 8 ]

139 голосов
/ 01 июля 2010

Одним из способов будет использование системного свойства 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, если ничего не было передано.

71 голосов
/ 01 июля 2010

Использование 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());
    }
}

Обновление согласно комментарию ФП:

Я хочу поместить кучу файлов 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() аргумента.

31 голосов
/ 05 июня 2012
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, но оно удаляет такие вещи, как ../../../

12 голосов
/ 15 мая 2013
this.getClass().getClassLoader().getResource("").getPath()
5 голосов
/ 29 апреля 2015

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

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

...

Path workingDirectory=Paths.get(".").toAbsolutePath();
4 голосов
/ 29 июля 2013

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

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));
3 голосов
/ 16 февраля 2018

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

System.out.println(new File("").getAbsolutePath());
3 голосов
/ 01 июля 2010

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

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

...