Java – Lees een bestand uit de bronnenmap
In Java kunnen we getResourceAsStream
of getResource
om een bestand of meerdere bestanden uit een resources
map of root van het klassenpad te lezen.
De getResourceAsStream
methode retourneert een InputStream
.
De getResource
methode retourneert een URL
en converteert deze normaal naar een File
; Werkt niet in JAR-bestand.
Bestanden in bronnenmap
1.1 Bekijk de bestanden in de src/main/resources
, later zullen we toegang krijgen tot de bestanden en print de inhoud van het bestand.
1.2 Bouw standaard tools zoals Maven, Gradle , of de gebruikelijke Java-praktijk zal alle bestanden van src/main/resources
naar de root van target/classes
of build/classes
. Dus als we een bestand proberen te lezen van src/main/resources
, lezen we het bestand uit de root van het project classpath.
1.3 Hieronder ziet u een JAR-bestandsstructuur. Gewoonlijk worden de bestanden in de map resources
naar de root van het klassenpad gekopieerd.
Haal een bestand op uit de bronnenmap.
2.1 Het onderstaande voorbeeld toont het gebruik van getResourceAsStream
en getResource
methoden om een bestand json/file1.json
uit de map resources
te lezen en de bestandsinhoud af te drukken.
Opmerking
- De
getResource
-methode werkt niet in het JAR-bestand. - De
getResourceAsStream
methode werkt overal.
Uitvoer
2.2 Nu pakken we het project in een JAR-bestand in en voeren het uit; deze keer zal de getResource
mislukken en ofwel NoSuchFileException
of InvalidPathException
retourneren. We kunnen de bestanden in het JAR-bestand niet lezen via de bron-URL.
Draai het JAR-bestand op Linux (Ubuntu), het gooit NoSuchFileException
.
Draai het JAR-bestand op Windows, het gooit InvalidPathException
.
PS Dit voorbeeld gebruikt de Maven-plug-in maven-jar-plugin
om het JAR-bestand te maken.
Haal een bestand op uit de bronnenmap – Unit Test
3.1 We plaatsen de testbronnen in de map src/test/resources
voor eenheidstests. Gewoonlijk worden de bestanden in testbronnen naar de map target/test-classes
gekopieerd.
3.2 Het werkt op dezelfde manier waarop we het bestand lezen van src/main/resources
. We gebruiken dezelfde getResourceAsStream
en getResource
methoden om het bestand te lezen van de src/test/resources
.
Uitvoer
Haal alle bestanden uit een bronnenmap. (NON-JAR-omgeving)
Als we de exacte bestandsnaam niet weten en alle bestanden willen lezen, inclusief submapbestanden uit een bronnenmap, kunnen we de NIO om de bestanden gemakkelijk te openen en te lezen.
4.1 In het onderstaande voorbeeld wordt Files.walk
gebruikt om alle bestanden uit een map src/main/resources/json
:
Output
4.2 De standaard Files.walk
in voorbeeld 4.1 heeft geen directe toegang tot de bestanden in het JAR-bestand, probeer het voorbeeld 4.1 in een JAR-omgeving uit te voeren en het gooit FileSystemNotFoundException
.
Haal alle bestanden uit een bronnenmap. (JAR-versie)
5.1 Dit voorbeeld laat zien hoe je Files.walk
een map in een JAR-bestand kunt FileSystems
en URI jar:file:xxx.jar
.
Het idee is:
- Bestand loopt door de map in een JAR-bestand met
FileSystems
, en verkrijg alle bestandsnamen, ziegetPathsFromResourceJAR()
- Herhaal alle bestandsnamen, open en print elk bestand zoals in voorbeeld 2.1, zie
getFileFromResourceAsStream()
.
Uitvoer
Broncode downloaden
$ git clone https://github.com/mkyong/core-java
$ cd java-io
- Files.walk JavaDoc
- CodeSource JavaDoc
- RFC 2396 – Syntaxis en indeling van een URI
- Maven – JAR-bestand maken
- Zip-bestandssysteemprovider
- Java Files.walk-voorbeelden
- Java – Haal het pad op van een actief JAR-bestand
mkyong
Oprichter van Mkyong.com, hou van Java en open source-dingen. Volg hem op Twitter. Als je mijn tutorials leuk vindt, overweeg dan om een donatie te doen aan deze goede doelen.