Java – odczyt pliku z folderu zasobów
W Javie możemy użyć getResourceAsStream
lub getResource
, aby odczytać plik lub wiele plików z folderu resources
lub katalogu głównego ścieżki klas.
Metoda getResourceAsStream
zwraca InputStream
.
getResource
zwraca URL
i normalnie konwertuje go na File
; Nie działa w pliku JAR.
Pliki w folderze zasobów
1.1 Przejrzyj pliki w src/main/resources
, później uzyskamy dostęp do plików i wydrukuj zawartość pliku.
1.2 Domyślnie narzędzia do budowania, takie jak Maven, Gradle lub popularna praktyka w Javie spowoduje skopiowanie wszystkich plików z src/main/resources
do katalogu głównego target/classes
lub build/classes
. Tak więc, kiedy próbujemy odczytać plik z src/main/resources
, czytamy plik z katalogu głównego ścieżki klas projektu.
1.3 Poniżej znajduje się struktura plików JAR. Zwykle pliki z folderu resources
zostaną skopiowane do katalogu głównego ścieżki klas.
Pobierz plik z folderu zasobów.
2.1 Poniższy przykład ilustruje użycie getResourceAsStream
i getResource
metody odczytu pliku json/file1.json
z folderu resources
i wydrukowania zawartości pliku.
Uwaga
- Metoda
getResource
nie działa w pliku JAR. -
getResourceAsStream
działa wszędzie.
Wyjście
2.2 Teraz pakujemy projekt do pliku JAR i uruchamiamy go; tym razem getResource
zakończy się niepowodzeniem i zwróci NoSuchFileException
lub InvalidPathException
. Nie możemy odczytać plików w pliku JAR za pomocą adresu URL zasobu.
Uruchom plik JAR w systemie Linux (Ubuntu), wyrzuca NoSuchFileException
.
Uruchom plik JAR w systemie Windows, wyrzuca InvalidPathException
.
PS To przykład wykorzystuje wtyczkę Maven maven-jar-plugin
do utworzenia pliku JAR.
Pobierz plik z folderu zasobów – Test jednostkowy
3.1 Umieściliśmy zasoby testowe w folderze src/test/resources
na potrzeby testów jednostkowych. Zwykle pliki w zasobach testowych są kopiowane do folderu target/test-classes
.
3.2 To działa w ten sam sposób czytamy plik z src/main/resources
. Używamy tych samych metod getResourceAsStream
i getResource
, aby odczytać plik z src/test/resources
.
Wyjście
Pobierz wszystkie pliki z folderu zasobów. (Środowisko NON-JAR)
Jeśli nie znamy dokładnej nazwy pliku i chcemy odczytać wszystkie pliki, w tym pliki podfolderów z folderu zasobów, możemy skorzystać z NIO Files.walk
w celu łatwego dostępu do plików i ich odczytywania.
4.1 Poniższy przykład wykorzystuje Files.walk
do odczytu wszystkich plików z folderu src/main/resources/json
:
Wyjście
4.2 Jednak standardowy Files.walk
w przykładzie 4.1 nie może uzyskać bezpośredniego dostępu do plików w pliku JAR, spróbuj uruchomić przykład 4.1 w środowisku JAR i wyrzuca FileSystemNotFoundException
.
Pobierz wszystkie pliki z folderu zasobów. (Wersja JAR)
5.1 Ten przykład pokazuje, jak Files.walk
folder w pliku JAR za pośrednictwem FileSystems
i URI jar:file:xxx.jar
.
Pomysł jest taki:
- Plik przechodzi przez folder wewnątrz pliku JAR za pomocą
FileSystems
i pobierz całą nazwę pliku, zobaczgetPathsFromResourceJAR()
- Zapętl całą nazwę pliku, uzyskaj dostęp i wydrukuj każdy plik, jak w przykładzie 2.1, patrz
getFileFromResourceAsStream()
.
Wyjście
Pobierz kod źródłowy
$ git clone https://github.com/mkyong/core-java
$ cd java-io
- Files.walk JavaDoc
- CodeSource JavaDoc
- RFC 2396 – Składnia i format identyfikatora URI
- Maven – Utwórz plik JAR
- Dostawca systemu plików Zip
- Przykłady plików Java Files.walk
- Java – Uzyskaj ścieżkę do uruchomionego pliku JAR
mkyong
Założyciel Mkyong.com, uwielbia Javę i open source. Śledź go na Twitterze. Jeśli podobają Ci się moje samouczki, rozważ przekazanie darowizny na te organizacje charytatywne.