Próbuję odczytać plik tekstowy ustawiony w zmiennej systemowej CLASSPATH. Nie zmienna użytkownika.
Próbuję uzyskać strumień wejściowy do pliku, jak poniżej:
Umieść katalog file ( D:\myDir
) w CLASSPATH i spróbuj poniżej:
InputStream in = this.getClass().getClassLoader().getResourceAsStream("SomeTextFile.txt");
InputStream in = this.getClass().getClassLoader().getResourceAsStream("/SomeTextFile.txt");
InputStream in = this.getClass().getClassLoader().getResourceAsStream("//SomeTextFile.txt");
Umieść pełną ścieżkę file ( D:\myDir\SomeTextFile.txt
) w CLASSPATH i wypróbuj tę samą powyżej 3 linii kodu.
Ale niestety ŻADNA z nich nie działa i zawsze wchodzę null
w mój InputStream in
.
getResourceAsStream()
File.Separator
- ponieważ nie prosisz o plik , prosisz o zasób . Ważne jest, aby zrozumieć, że abstrakcja nie jest systemem plików.Class.getResourceAsStream
jest to naprawdę wygodna metoda wywoływaniaClassLoader.getResourceAsStream
, ale z dodatkową funkcją „względnych” zasobów. Jeśli określasz zasób bezwzględny, każde wywołanie korzystające z tego samego modułu ładującego klasę zrobi to samo.Korzystając z Spring Framework (jako zestawu narzędzi lub kontenera - nie musisz korzystać z tej drugiej funkcji), możesz łatwo użyć abstrakcji zasobów .
Poprzez interfejs zasobu możesz uzyskać dostęp do zasobu jako InputStream , URL , URI lub Plik . Zmiana typu zasobu na np. Zasób systemu plików to prosta kwestia zmiany instancji.
źródło
Oto jak czytam wszystkie wiersze pliku tekstowego na mojej ścieżce klasy, używając Java 7 NIO:
Uwaga: jest to przykład tego, jak można to zrobić. W razie potrzeby będziesz musiał wprowadzić poprawki. Ten przykład będzie działał tylko wtedy, gdy plik rzeczywiście znajduje się w ścieżce klasy, w przeciwnym razie zostanie wygenerowany wyjątek NullPointerException, gdy getResource () zwróci null i zostanie na nim wywołane .toURI ().
Ponadto, od wersji Java 7, jednym z wygodnych sposobów określania zestawów znaków jest użycie stałych zdefiniowanych w
java.nio.charset.StandardCharsets
(zgodnie z ich javadocami „gwarantuje się, że będą one dostępne na każdej implementacji platformy Java”).Dlatego jeśli znasz kodowanie pliku w formacie UTF-8, określ jawnie zestaw znaków
StandardCharsets.UTF_8
źródło
Spring
„sStreamUtils.copyToString
.Proszę spróbować
Twoje próby nie zadziałały, ponieważ tylko moduł ładujący klasy dla twoich klas jest w stanie załadować ze ścieżki klas. Użyłeś modułu ładującego klasy dla samego systemu Java.
źródło
Aby faktycznie odczytać zawartość pliku, lubię używać Commons IO + Spring Core. Zakładając Java 8:
Alternatywnie:
źródło
Aby uzyskać bezwzględną ścieżkę klasy, spróbuj:
źródło
Jakoś najlepsza odpowiedź nie działa dla mnie. Zamiast tego muszę użyć nieco innego kodu.
Mam nadzieję, że pomoże to tym, którzy napotykają ten sam problem.
źródło
Jeśli używasz Guawy:
możemy uzyskać adres URL z CLASSPATH:
lub InputStream:
źródło
Aby odczytać zawartość pliku z ciągu znaków
classpath
, możesz użyć tego:Uwaga:
IOUtils
jest częściąCommons IO
.Nazwij to tak:
źródło
Mówisz „Próbuję odczytać plik tekstowy ustawiony w zmiennej systemowej CLASSPATH”. Domyślam się, że jest to w systemie Windows i używasz tego brzydkiego okna dialogowego do edycji „Zmiennych systemowych”.
Teraz uruchamiasz program Java w konsoli. I to nie działa: Konsola dostaje kopię wartości zmiennych systemowych raz , gdy jest on zaczął . Oznacza to, że późniejsza zmiana w oknie dialogowym nie ma żadnego efektu.
Istnieją następujące rozwiązania:
Po każdej zmianie uruchom nową konsolę
Użyj
set CLASSPATH=...
w konsoli, aby ustawić kopię zmiennej w konsoli, a gdy kod zadziała, wklej ostatnią wartość do okna dialogowego zmiennej.Umieść wywołanie Java w
.BAT
pliku i kliknij go dwukrotnie. Spowoduje to utworzenie nowej konsoli za każdym razem (kopiując w ten sposób bieżącą wartość zmiennej systemowej).UWAGA: jeśli masz również zmienną użytkownika
CLASSPATH
, będzie ona przesłaniać zmienną systemową. Dlatego zwykle lepiej jest umieścić wywołanie programu Java w.BAT
pliku i ustawić tam ścieżkę klasy (używającset CLASSPATH=
), zamiast polegać na globalnym systemie lub zmiennej użytkownika.Zapewnia to również, że na komputerze może działać więcej niż jeden program Java, ponieważ mają one różne ścieżki klas.
źródło
Moja odpowiedź nie jest dokładnie taka, jak zadana w pytaniu. Daję raczej rozwiązanie dokładnie, jak łatwo możemy odczytać plik do naszej aplikacji Java z naszej ścieżki klasy projektu.
Załóżmy na przykład, że nazwa pliku konfiguracyjnego example.xml znajduje się w ścieżce jak poniżej: -
com.myproject.config.dev
a nasz plik klasy wykonywalnej Java jest w poniższej ścieżce: -
com.myproject.server.main
teraz wystarczy wpisać obie powyższe ścieżki, które są najbliższym wspólnym katalogiem / folderem, z którego można uzyskać dostęp zarówno do katalogu dev, jak i katalogu głównego / folder (com.myproject.server.main - gdzie istnieje klasa wykonywalna aplikacji java) - Widzimy że jest to folder / katalog myproject, który jest najbliższym wspólnym katalogiem / folderem, z którego możemy uzyskać dostęp do naszego pliku example.xml. Dlatego z klasy wykonywalnej java znajdującej się w głównym folderze / katalogu musimy cofnąć się o dwa kroki, jak ../../, aby uzyskać dostęp do myproject . Teraz, po tym, zobacz, jak możemy odczytać plik: -
źródło
Jeśli skompilujesz projekt w pliku jar: możesz umieścić plik w pliku resources / files / your_file.text lub pdf;
i użyj tego kodu:
źródło
Korzystam z serwera aplikacji webshpere, a mój moduł WWW jest oparty na Spring MVC.
Test.properties
Znajdowały się w folderze zasobów, próbowałem załadować pliki przy użyciu następujących:this.getClass().getClassLoader().getResourceAsStream("Test.properties");
this.getClass().getResourceAsStream("/Test.properties");
Żaden z powyższych kodów nie załadował pliku.
Ale za pomocą poniższego kodu plik właściwości został pomyślnie załadowany:
Thread.currentThread().getContextClassLoader().getResourceAsStream("Test.properties");
Dzięki użytkownikowi „user1695166” .
źródło
Posługiwać się
org.apache.commons.io.FileUtils.readFileToString(new File("src/test/resources/sample-data/fileName.txt"));
źródło
Scenariusz:
1)
client-service-1.0-SNAPSHOT.jar
ma zależnośćread-classpath-resource-1.0-SNAPSHOT.jar
2) chcemy odczytać zawartość zasobów ścieżki klasy (
sample.txt
)read-classpath-resource-1.0-SNAPSHOT.jar
przezclient-service-1.0-SNAPSHOT.jar
.3)
read-classpath-resource-1.0-SNAPSHOT.jar
masrc/main/resources/sample.txt
1.
pom.xml
zread-classpath-resource-1.0-SNAPSHOT.jar
2.
ClassPathResourceReadTest.java
klasa,read-classpath-resource-1.0-SNAPSHOT.jar
która ładuje zawartość pliku zasobów ścieżki klasy.3.
pom.xml
zclient-service-1.0-SNAPSHOT.jar
4.
AccessClassPathResource.java
utwórz instancjęClassPathResourceReadTest.java
klasy, do której ładuje sięsample.txt
i drukuje również jej zawartość.5. Uruchom słoik wykonywalny w następujący sposób:
źródło
Nie używaj metody getClassLoader () i używaj „/” przed nazwą pliku. "/" to bardzo ważne
źródło
/
ma dokładnie taki sam efekt, jak użyciegetClassLoader()
metody.źródło
musisz umieścić swoją „zmienną systemową” na ścieżce klasy Java.
źródło