Załóż standardową konfigurację Mavena.
Powiedz w folderze zasobów, że masz plik abc
.
W Javie, jak mogę uzyskać bezwzględną ścieżkę do pliku?
Załóż standardową konfigurację Mavena.
Powiedz w folderze zasobów, że masz plik abc
.
W Javie, jak mogę uzyskać bezwzględną ścieżkę do pliku?
Odpowiedzi:
Możesz użyć ClassLoader.getResource
metody, aby uzyskać właściwy zasób.
URL res = getClass().getClassLoader().getResource("abc.txt");
File file = Paths.get(res.toURI()).toFile();
String absolutePath = file.getAbsolutePath();
LUB
Chociaż może to nie działać przez cały czas, prostsze rozwiązanie -
Możesz stworzyć File
obiekt i użyć getAbsolutePath
metody:
File file = new File("resources/abc.txt");
String absolutePath = file.getAbsolutePath();
target/classes/abc.txt
jako odniesienia do pliku, ponieważ jest to kanoniczne miejsce, w którym Maven umieszcza pliki zasobów po przetworzeniu (na przykład wtyczka maven-resources mogła wykonać podstawienie właściwości w abc.txt). Znacznie lepiej jest użyć abc.txt poprzez getResource () ze ścieżki klas.
Właściwy sposób, który faktycznie działa:
URL resource = YourClass.class.getResource("abc");
Paths.get(resource.toURI()).toFile();
Nie ma teraz znaczenia, gdzie fizycznie znajduje się plik w ścieżce klas, zostanie znaleziony, o ile zasób jest w rzeczywistości plikiem, a nie wpisem JAR.
(Pozornie oczywiste new File(resource.getPath())
nie działa dla wszystkich ścieżek! Ścieżka jest nadal zakodowana w adresie URL!)
new File(resource.toURI()).getAbsolutePath();
(tj. Nie sądzę, że potrzebujesz obiektu Path?)
new File(YourClass.class.getResource("abc").toURI().getPath())
jeśli chcesz.
.getResource("/abc")
Utwórz instancję classLoader klasy, której potrzebujesz, aby uzyskać łatwy dostęp do plików lub zasobów. teraz masz dostęp do ścieżki używając getPath()
metody tej klasy.
ClassLoader classLoader = getClass().getClassLoader();
String path = classLoader.getResource("chromedriver.exe").getPath();
System.out.println(path);
Aby zwrócić plik lub ścieżkę do pliku
URL resource = YourClass.class.getResource("abc");
File file = Paths.get(resource.toURI()).toFile(); // return a file
String filepath = Paths.get(resource.toURI()).toFile().getAbsolutePath(); // return file path
Na naszej drodze do ścieżki absolutnej są dwa problemy:
Poniższy kod da nam wszystkie przydatne ścieżki:
URL localPackage = this.getClass().getResource("");
URL urlLoader = YourClassName.class.getProtectionDomain().getCodeSource().getLocation();
String localDir = localPackage.getPath();
String loaderDir = urlLoader.getPath();
System.out.printf("loaderDir = %s\n localDir = %s\n", loaderDir, localDir);
Tutaj badane są obie funkcje, których można użyć do lokalizacji folderu zasobów. Co do tego class
, można to uzyskać w dowolny sposób, statycznie lub dynamicznie.
Jeśli projektu nie ma we wtyczce, kod, jeśli zostanie uruchomiony w JUnit, wydrukuje:
loaderDir = /C:.../ws/source.dir/target/test-classes/
localDir = /C:.../ws/source.dir/target/test-classes/package/
Tak więc, aby dostać się do src / rest / resources, powinniśmy poruszać się w górę iw dół drzewa plików. Można zastosować obie metody. Zauważ, że nie możemy użyć getResource(resourceFolderName)
, ponieważ ten folder nie znajduje się w folderze docelowym. Mam nadzieję, że nikt nie umieszcza zasobów w utworzonych folderach.
Jeśli klasa znajduje się w pakiecie znajdującym się we wtyczce, wynikiem tego samego testu będzie:
loaderDir = /C:.../ws/plugin/bin/
localDir = /C:.../ws/plugin/bin/package/
Więc znowu powinniśmy poruszać się w górę iw dół drzewa folderów.
Najciekawszy jest przypadek, gdy pakiet jest uruchamiany we wtyczce. Jako test wtyczki JUnit, na przykład. Wynik to:
loaderDir = /C:.../ws/plugin/
localDir = /package/
Tutaj możemy uzyskać ścieżkę bezwzględną tylko łącząc wyniki obu funkcji. I to nie wystarczy. Pomiędzy nimi należy umieścić ścieżkę lokalną miejsca, w którym znajdują się pakiety klas, względem folderu wtyczek. Prawdopodobnie będziesz musiał wstawić coś jako src
lub src/test/resource
tutaj.
Możesz wstawić kod do swojego i zobaczyć ścieżki, które masz.