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

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

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

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

110
задан The Guy with The Hat 18 December 2018 в 18:57
поделиться

3 ответа

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

145
ответ дан 24 November 2019 в 03:11
поделиться

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

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

3
ответ дан 24 November 2019 в 03:11
поделиться

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

Это потребует жесткого кодирования/знания их относительного пути в вашей программе. Лучше подумайте о добавлении пути к папке в classpath, чтобы вы могли использовать 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().

73
ответ дан 24 November 2019 в 03:11
поделиться
Другие вопросы по тегам:

Похожие вопросы: