Скажем, у меня есть свой основной класс в C:\Users\Justian\Documents\
. Как я могу заставить свою программу показывать, что это находится в C:\Users\Justian\Documents
?
Жесткое кодирование не является опцией - это должно быть адаптируемо, если это перемещено в другое местоположение.
Я хочу вывести набор файлов CSV в папке, иметь программу, распознают все файлы, затем загружают данные и управляют ими. Я действительно просто хочу знать, как перейти к той папке.
Одним из способов может быть использование системного свойства 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
, если ничего не было передано.
Кто сказал, что ваш основной класс находится в файле на локальном жестком диске? Классы чаще объединяются в файлы JAR, а иногда загружаются по сети или даже генерируются «на лету».
Так что же вы на самом деле хотите делать? Вероятно, есть способ сделать это, не делая предположений о происхождении классов.
Используйте 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()
.