Ich versuche, eine Textdatei zu lesen, die in der Systemvariablen CLASSPATH festgelegt ist. Keine Benutzervariable.
Ich versuche, den Eingabestream wie folgt in die Datei zu bringen:
Platzieren Sie das Verzeichnis von file ( D:\myDir
) in CLASSPATH und versuchen Sie es unten:
InputStream in = this.getClass().getClassLoader().getResourceAsStream("SomeTextFile.txt");
InputStream in = this.getClass().getClassLoader().getResourceAsStream("/SomeTextFile.txt");
InputStream in = this.getClass().getClassLoader().getResourceAsStream("//SomeTextFile.txt");
Platzieren Sie den vollständigen Pfad von file ( D:\myDir\SomeTextFile.txt
) in CLASSPATH und versuchen Sie dasselbe über 3 Codezeilen.
Aber leider funktioniert KEINER von ihnen und ich null
komme immer in meinen InputStream in
.
getResourceAsStream()
File.Separator
- weil Sie nicht nach einer Datei fragen, fragen Sie nach einer Ressource . Es ist wichtig zu verstehen, dass es sich bei der Abstraktion nicht um das Dateisystem handelt.Class.getResourceAsStream
liegt daran, dass dies wirklich eine bequeme Methode zum Aufrufen istClassLoader.getResourceAsStream
, aber mit der zusätzlichen Funktion "relativer" Ressourcen. Wenn Sie eine absolute Ressource angeben, führt jeder Aufruf mit demselben Klassenladeprogramm dasselbe aus.Wenn Sie das Spring Framework verwenden (entweder als Sammlung von Dienstprogrammen oder als Container - Sie müssen die letztere Funktionalität nicht verwenden), können Sie die Ressourcenabstraktion problemlos verwenden .
Über die Ressourcenschnittstelle können Sie als InputStream , URL , URI oder Datei auf die Ressource zugreifen . Das Ändern des Ressourcentyps in z. B. eine Dateisystemressource ist eine einfache Angelegenheit zum Ändern der Instanz.
quelle
So lese ich mit Java 7 NIO alle Zeilen einer Textdatei in meinem Klassenpfad:
NB dies ist ein Beispiel dafür, wie es gemacht werden kann. Sie müssen bei Bedarf Verbesserungen vornehmen. Dieses Beispiel funktioniert nur, wenn die Datei tatsächlich in Ihrem Klassenpfad vorhanden ist. Andernfalls wird eine NullPointerException ausgelöst, wenn getResource () null zurückgibt und .toURI () darauf aufgerufen wird.
Seit Java 7 besteht eine bequeme Möglichkeit, Zeichensätze anzugeben, darin, die in definierten Konstanten zu verwenden
java.nio.charset.StandardCharsets
(diese sind laut ihren Javadocs "garantiert bei jeder Implementierung der Java-Plattform verfügbar").Wenn Sie also die Codierung der Datei als UTF-8 kennen, geben Sie den Zeichensatz explizit an
StandardCharsets.UTF_8
quelle
Spring
's verwendenStreamUtils.copyToString
.Bitte versuche
Ihre Versuche haben nicht funktioniert, da nur der Klassenlader für Ihre Klassen aus dem Klassenpfad geladen werden kann. Sie haben den Klassenlader für das Java-System selbst verwendet.
quelle
Um den Inhalt der Datei tatsächlich zu lesen, verwende ich gerne Commons IO + Spring Core. Angenommen, Java 8:
Alternative:
quelle
Um den absoluten Klassenpfad zu erhalten, versuchen Sie Folgendes:
quelle
Irgendwie funktioniert die beste Antwort bei mir nicht. Ich muss stattdessen einen etwas anderen Code verwenden.
Ich hoffe, dies hilft denen, die auf das gleiche Problem stoßen.
quelle
Wenn Sie Guave verwenden:
Wir können die URL von CLASSPATH erhalten:
oder InputStream:
quelle
Um den Inhalt einer Datei in einen String aus dem zu lesen
classpath
, können Sie Folgendes verwenden:Hinweis:
IOUtils
ist Teil vonCommons IO
.Nennen Sie es so:
quelle
Sie sagen: "Ich versuche, eine Textdatei zu lesen, die in der Systemvariablen CLASSPATH festgelegt ist." Ich vermute, dies ist unter Windows und Sie verwenden diesen hässlichen Dialog, um die "Systemvariablen" zu bearbeiten.
Jetzt führen Sie Ihr Java-Programm in der Konsole aus. Und das funktioniert nicht: Die Konsole erhält beim Start einmal eine Kopie der Werte der Systemvariablen . Dies bedeutet jede Änderung im Dialog danach keine Auswirkungen hat.
Es gibt diese Lösungen:
Starten Sie nach jeder Änderung eine neue Konsole
Verwenden Sie diese Option
set CLASSPATH=...
in der Konsole, um die Kopie der Variablen in der Konsole festzulegen. Wenn Ihr Code funktioniert, fügen Sie den letzten Wert in den Variablendialog ein.Legen Sie den Aufruf von Java in eine
.BAT
Datei und doppelklicken Sie darauf. Dadurch wird jedes Mal eine neue Konsole erstellt (wodurch der aktuelle Wert der Systemvariablen kopiert wird).ACHTUNG: Wenn Sie auch eine Benutzervariable haben,
CLASSPATH
wird diese Ihre Systemvariable beschatten. Aus diesem Grund ist es normalerweise besser, den Aufruf Ihres Java-Programms in eine.BAT
Datei zu schreiben und dort den Klassenpfad festzulegen (usingset CLASSPATH=
), als sich auf ein globales System oder eine Benutzervariable zu verlassen.Dadurch wird auch sichergestellt, dass auf Ihrem Computer mehr als ein Java-Programm ausgeführt werden kann, da diese unterschiedliche Klassenpfade haben müssen.
quelle
Meine Antwort ist nicht genau das, was in der Frage gestellt wird. Vielmehr gebe ich eine Lösung genau an, wie einfach wir eine Datei aus unserem Projektklassenpfad in unsere Java-Anwendung einlesen können.
Angenommen, ein Konfigurationsdateiname example.xml befindet sich in einem Pfad wie folgt: -
com.myproject.config.dev
und unsere ausführbare Java-Klassendatei befindet sich im folgenden Pfad: -
com.myproject.server.main
Checken Sie jetzt einfach den obigen Pfad ein, der das nächste gemeinsame Verzeichnis / Ordner ist, von dem aus Sie sowohl auf dev als auch auf das Hauptverzeichnis / den Hauptordner zugreifen können (com.myproject.server.main - wo die ausführbare Java-Klasse unserer Anwendung vorhanden ist) dass es sich um myproject Ordner / Verzeichnis handelt, das das nächste gemeinsame Verzeichnis / Ordner ist, von dem aus wir auf unsere Datei example.xml zugreifen können. Daher müssen wir von einer ausführbaren Java-Klasse im Ordner / Verzeichnis main zwei Schritte wie ../../ zurückgehen, um auf myproject zuzugreifen . Sehen Sie sich nun an, wie wir die Datei lesen können: -
quelle
Wenn Sie Ihr Projekt in einer JAR-Datei kompilieren: Sie können Ihre Datei in resources / files / your_file.text oder pdf ablegen.
und benutze diesen Code:
quelle
Ich verwende den Webshpere-Anwendungsserver und mein Webmodul basiert auf Spring MVC. Die
Test.properties
befanden sich im Ressourcenordner, ich habe versucht, diese Dateien wie folgt zu laden:this.getClass().getClassLoader().getResourceAsStream("Test.properties");
this.getClass().getResourceAsStream("/Test.properties");
Keiner der oben genannten Codes hat die Datei geladen.
Mit Hilfe des folgenden Codes wurde die Eigenschaftendatei jedoch erfolgreich geladen:
Thread.currentThread().getContextClassLoader().getResourceAsStream("Test.properties");
Vielen Dank an den Benutzer "user1695166" .
quelle
Verwenden
org.apache.commons.io.FileUtils.readFileToString(new File("src/test/resources/sample-data/fileName.txt"));
quelle
Szenario:
1)
client-service-1.0-SNAPSHOT.jar
hat Abhängigkeitread-classpath-resource-1.0-SNAPSHOT.jar
2) Wir möchten den Inhalt von Klassenpfadressourcen lesen (
sample.txt
) vonread-classpath-resource-1.0-SNAPSHOT.jar
durchclient-service-1.0-SNAPSHOT.jar
.3)
read-classpath-resource-1.0-SNAPSHOT.jar
hatsrc/main/resources/sample.txt
1.
pom.xml
vonread-classpath-resource-1.0-SNAPSHOT.jar
2.
ClassPathResourceReadTest.java
Klasseread-classpath-resource-1.0-SNAPSHOT.jar
, die den Inhalt der Klassenpfadressourcendatei lädt.3.
pom.xml
vonclient-service-1.0-SNAPSHOT.jar
4.
AccessClassPathResource.java
Instanziieren Sie dieClassPathResourceReadTest.java
Klasse, in die sie geladen wird,sample.txt
und drucken Sie auch ihren Inhalt.5. Führen Sie das ausführbare Glas wie folgt aus:
quelle
Verwenden Sie nicht die Methode getClassLoader () und das "/" vor dem Dateinamen. "/" ist sehr wichtig
quelle
/
hat genau den gleichen Effekt wie die Verwendung dergetClassLoader()
Methode.quelle
Sie müssen Ihre 'Systemvariable' in den Java-Klassenpfad einfügen.
quelle