Как получить текущий рабочий каталог в 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