Powiedzmy, że mam swoją główną klasę C:\Users\Justian\Documents\
. Jak mogę sprawić, by mój program pokazał, że jest dostępny C:\Users\Justian\Documents
?
Hard-Coding nie wchodzi w grę - musi być przystosowalne, jeśli zostanie przeniesione w inne miejsce.
Chcę zrzucić kilka plików CSV do folderu, poprosić program o rozpoznanie wszystkich plików, a następnie załadować dane i manipulować nimi. Naprawdę chcę tylko wiedzieć, jak przejść do tego folderu.
java
path
working-directory
Justian Meyer
źródło
źródło
Odpowiedzi:
Jednym ze sposobów byłoby użycie właściwości systemowej,
System.getProperty("user.dir");
która da ci „Bieżący katalog roboczy, kiedy właściwości zostały zainicjowane”. Prawdopodobnie tego chcesz. aby dowiedzieć się, gdziejava
polecenie zostało wydane, w twoim przypadku w katalogu z plikami do przetworzenia, nawet jeśli rzeczywisty plik .jar może znajdować się gdzie indziej na komputerze. Posiadanie katalogu z rzeczywistym plikiem .jar nie jest przydatne w większości przypadków.Poniższe polecenia wydrukują bieżący katalog, z którego polecenie zostało wywołane, niezależnie od tego, gdzie znajduje się plik .class lub .jar, w którym znajduje się plik .class.
jeśli jesteś w programie,
/User/me/
a plik .jar zawierający powyższy kod jest w/opt/some/nested/dir/
poleceniujava -jar /opt/some/nested/dir/test.jar Test
, wyświetli sięcurrent dir = /User/me
.Jako bonus powinieneś również przyjrzeć się używaniu dobrego obiektowego parsera argumentów wiersza poleceń. Bardzo polecam JSAP , Java Simple Argument Parser. Umożliwiłoby to użycie
System.getProperty("user.dir")
i alternatywnie przekazanie czegoś innego, aby zastąpić to zachowanie. O wiele łatwiejsze w utrzymaniu rozwiązanie. To sprawiłoby, że przekazywanie do katalogu w celu przetworzenia byłoby bardzo łatwe do wykonania iuser.dir
gdyby nic nie zostało przekazane , można by do niego wrócić .źródło
user.dir
jest bardzo łatwy w użyciu. System.getProperty ("user.dir");Użyj
CodeSource#getLocation()
. Działa to również dobrze w plikach JAR. Możesz uzyskaćCodeSource
przez,ProtectionDomain#getCodeSource()
a zProtectionDomain
kolei można uzyskać przezClass#getProtectionDomain()
.Aktualizacja zgodnie z komentarzem PO:
Wymagałoby to zakodowania / znajomości ich względnej ścieżki w programie. Zamiast tego rozważ dodanie jego ścieżki do ścieżki klas, aby można było użyć
ClassLoader#getResource()
Lub przekazać swoją ścieżkę jako
main()
argument.źródło
getLocation()
metodę. Inne oczywiście nie będą działać.Drukuje coś takiego:
Zwróć uwagę, że
File.getCanonicalPath()
zgłasza sprawdzony IOException, ale usunie takie rzeczy, jak../../../
źródło
źródło
Właśnie użyłem:
...
źródło
Paths.get("").toAbsolutePath();
Paths.get("my/file").toAbsolutePath()
dostanę/my/file
, co na pewno nie jest cwd.Jeśli chcesz uzyskać bieżący katalog roboczy, użyj następującego wiersza
źródło
Jeśli chcesz mieć bezwzględną ścieżkę obecnego kodu źródłowego, moja sugestia jest taka:
źródło
Kto powiedział, że twoja główna klasa jest w pliku na lokalnym dysku twardym? Klasy są częściej umieszczane w plikach JAR i czasami ładowane przez sieć, a nawet generowane w locie.
Więc co tak naprawdę chcesz robić? Prawdopodobnie istnieje sposób, aby to zrobić, który nie zakłada założeń, skąd pochodzą klasy.
źródło