Chcę uzyskać dostęp do mojego bieżącego katalogu roboczego za pomocą java.
Mój kod:
String current = new java.io.File( "." ).getCanonicalPath();
System.out.println("Current dir:"+current);
String currentDir = System.getProperty("user.dir");
System.out.println("Current dir using System:" +currentDir);
Wynik:
Current dir: C:\WINDOWS\system32
Current dir using System: C:\WINDOWS\system32
Moje dane wyjściowe są nieprawidłowe, ponieważ dysk C nie jest moim bieżącym katalogiem.
Jak uzyskać bieżący katalog?
cd
polecenia w wierszu polecenia po wykonaniu?Odpowiedzi:
Spowoduje to wydrukowanie pełnej ścieżki bezwzględnej, z której zainicjowano aplikację.
Z dokumentacji :
java.io
pakiet rozpoznaje względne ścieżki przy użyciu bieżącego katalogu użytkownika. Bieżący katalog jest reprezentowany jako właściwość systemowa, czyliuser.dir
katalog, z którego została wywołana maszyna JVM.źródło
Zobacz: http://docs.oracle.com/javase/tutorial/essential/io/pathOps.html
Za pomocą
java.nio.file.Path
ijava.nio.file.Paths
możesz wykonać następujące czynności, aby pokazać, co Java uważa za twoją bieżącą ścieżkę. Działa to od 7 lat i używa NIO.Dane wyjściowe,
Current relative path is: /Users/george/NetBeansProjects/Tutorials
które w moim przypadku są miejscem, z którego prowadziłem klasę. Konstruowanie ścieżek we względny sposób, nie używając separatora wiodącego do wskazania, że budujesz ścieżkę bezwzględną, wykorzysta tę ścieżkę względną jako punkt początkowy.źródło
Paths.get("").getParent()
dajenull
. Zamiast tego działa:Paths.get("").toAbsolutePath().getParent()
.Poniższe działa na Javie 7 i nowszych (patrz dokumentacja tutaj ).
źródło
import java.io.File; File(".").getAbsolutePath()
?Paths.get()
można uznać za lepszy, ponieważ daje bezpośredni dostęp do bardziej wydajnegoPath
interfejsu..normalize()
w tym kontekście?Returns a path that is this path with redundant name elements eliminated.
To da ci ścieżkę do twojego bieżącego katalogu roboczego:
To da ci ścieżkę do pliku o nazwie „Foo.txt” w katalogu roboczym:
Edycja: Aby uzyskać bezwzględną ścieżkę do bieżącego katalogu:
* Aktualizacja * Aby uzyskać bieżący katalog roboczy:
źródło
Path path = FileSystems.getDefault().getPath(".").toAbsolutePath();
Path
obiekt wskazujący plik o nazwie.
wewnątrz bieżącego działającego katalogu. Używanie pustego ciągu zamiast"."
pracować dla mnie.To jest dla mnie rozwiązanie
źródło
new File("").getAbsoluteFile()
zamiast tego./
przy tworzeniu ścieżki względnej. Myliłem się, nie zaczynaj/
.../
działa również przy przechodzeniu do góry w drzewie katalogów..
.Znalazłem to rozwiązanie w komentarzach, które jest lepsze niż inne i bardziej przenośne:
Lub nawet
źródło
Co sprawia, że myślisz, że c: \ windows \ system32 nie jest twoim bieżącym katalogiem?
user.dir
Nieruchomość jest wyraźnie będzie „bieżący katalog roboczy użytkownika”.Innymi słowy, chyba że uruchamiasz Javę z wiersza poleceń, c: \ windows \ system32 prawdopodobnie jest twoją CWD. Oznacza to, że jeśli klikniesz dwukrotnie, aby uruchomić program, prawdopodobnie nie będzie katalogu, z którego klikniesz dwukrotnie.
Edycja : Wygląda na to, że dotyczy to tylko starych wersji Windows i / lub Java.
źródło
user.dir
jest to folder, w którym dwukrotnie kliknąłem plik jar.Zastosowanie
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()
.źródło
źródło
""
jeśli aplikacja działa z pliku JAR lub elementu CLASSPATH. Nie o to poproszono.getClass()
jest metodą obiektową, więc w kontekście statycznym samo usunięciethis
nie działa. Musiałbyś wyraźnie odnieść się do klasy, w której uczestniczyszMyClass.class.getClassLoader().....
.ogólnie jako obiekt File:
możesz chcieć mieć pełny ciąg znaków, taki jak „D: / a / b / c” wykonujący:
źródło
Korzystam z systemu Linux i uzyskuję taki sam wynik dla obu tych podejść:
Paths.get("")
dokumentySystem.getProperty("user.dir")
dokumentyźródło
W systemie Linux po uruchomieniu pliku jar z terminala oba zwrócą to samo
String
: „/ home / CurrentUser” , bez względu na to, gdzie znajduje się plik jar. Zależy to tylko od tego, jakiego bieżącego katalogu używasz z terminalem podczas uruchamiania pliku jar.Jeśli twoja
Class
zmain
zostanie wywołanaMainClass
, spróbuj:Będzie to zwróci
String
z bezwzględną ścieżkę do jar pliku.źródło
Użycie Windows user.dir zwraca katalog zgodnie z oczekiwaniami, ale NIE przy uruchamianiu aplikacji z podwyższonymi uprawnieniami (działającymi jako administrator), w takim przypadku otrzymujesz C: \ WINDOWS \ system32
źródło
Mam nadzieję, że chcesz uzyskać dostęp do bieżącego katalogu wraz z pakietem, tj. Jeśli Twój program Java jest już włączony
c:\myApp\com\foo\src\service\MyTest.java
i chcesz wydrukować doc:\myApp\com\foo\src\service
tego czasu , możesz wypróbować następujący kod:Uwaga: ten kod jest testowany tylko w systemie Windows z Oracle JRE.
źródło
File.separator
zamiast lub konstruktor z wieloma argumentamiFile
); 3. ścieżka klasy jest określona w wierszu poleceń, a „bieżący katalog zawierający pakiet” (??) to: a. określone najpierw, b. określone absolutnie, c. dokładnie pasuje do CWD (nawet przy braku rozróżniania wielkości liter w systemie Windows) oraz d. jest potomkiem CWDWspomnij, że jest sprawdzany tylko w,
Windows
ale myślę, że działa idealnie na innych systemach operacyjnych [Linux,MacOs,Solaris
] :).Miałem 2
.jar
pliki w tym samym katalogu. Chciałem, aby z jednego.jar
pliku uruchomić drugi.jar
plik, który znajduje się w tym samym katalogu.Problem polega na tym, że po uruchomieniu z
cmd
bieżącego katalogu jestsystem32
.;][[;'57f2g34g87-8+9-09!2#@!$%^^&()
lub()%&$%^@#
działa dobrze.ProcessBuilder
z poniższych poniżej:🍂 ..
🍂
getBasePathForClass(Class<?> classs)
:źródło
Bieżący katalog roboczy jest różnie zdefiniowany w różnych implementacjach Java. W przypadku niektórych wersji wcześniejszych niż Java 7 nie było spójnego sposobu uzyskania katalogu roboczego. Można obejść ten problem, uruchamiając plik Java
-D
i definiując zmienną do przechowywania informacjiCoś jak
To nie do końca prawda, ale masz pomysł. Więc
System.getProperty("com.mycompany.workingDir")
...źródło
Załóżmy, że próbujesz uruchomić swój projekt w środowisku Eclipse lub w sieci lub samodzielnie z wiersza poleceń. Mam sposób, aby to naprawić
Aby użyć wszędzie tam, gdzie chcesz uzyskać podstawową ścieżkę do odczytu pliku, możesz przekazać klasę zakotwiczenia do powyższej metody, wynik może być tym, czego potrzebujesz: D
Najlepsza,
źródło
Żadna z zamieszczonych tutaj odpowiedzi nie działała dla mnie. Oto, co zadziałało:
Edycja: Ostateczna wersja w moim kodzie:
źródło
To jest moja srebrna kula, kiedy tylko pojawia się moment pomieszania. (Nazwij to przede wszystkim). Może na przykład JVM ma inną wersję IDE. Ta funkcja statyczna wyszukuje bieżący PID procesu i otwiera VisualVM na tym pid. Zamieszanie kończy się tutaj, ponieważ chcesz tego wszystkiego i dostajesz to ...
źródło
System.getProperty("java.class.path")
źródło
to jest nazwa bieżącego katalogu
to jest bieżąca ścieżka do katalogu
źródło