Das java.io.File
und Konsortium wirkt auf das lokale Datenträger-Dateisystem. Die Hauptursache für Ihr Problem ist, dass die relativen Pfade in java.io
vom aktuellen Arbeitsverzeichnis abhängen. Dh das Verzeichnis, von dem aus die JVM (in Ihrem Fall die des Webservers) gestartet wird. Dies kann zum Beispiel C:\Tomcat\bin
oder etwas ganz anderes sein, aber somit nicht C:\Tomcat\webapps\contextname
oder was auch immer Sie erwarten würden. In einem normalen Eclipse-Projekt wäre das C:\Eclipse\workspace\projectname
. Sie können das aktuelle Arbeitsverzeichnis folgendermaßen kennenlernen:
System.out.println(new File(".").getAbsolutePath());
Das Arbeitsverzeichnis ist jedoch in keiner Weise programmgesteuert steuerbar. Sie sollten es wirklich vorziehen, absolute Pfade in der File
API anstelle relativer Pfade zu verwenden. ZB C:\full\path\to\file.ext
.
Sie möchten den absoluten Pfad in Java (Web) -Anwendungen nicht fest codieren oder erraten. Das ist nur ein Portabilitätsproblem (dh es läuft in System X, aber nicht in System Y). Normalerweise wird diese Art von Ressourcen in den Klassenpfad eingefügt oder der vollständige Pfad zum Klassenpfad hinzugefügt (in einer IDE wie Eclipse ist dies der src
Ordner bzw. der "Erstellungspfad"). Auf diese Weise können Sie sie mit Hilfe von ClassLoader
by ClassLoader#getResource()
oder greifen ClassLoader#getResourceAsStream()
. Es ist in der Lage, Dateien relativ zum "Stamm" des Klassenpfads zu finden, wie Sie zufällig herausgefunden haben. In Webanwendungen (oder jeder anderen Anwendung, die mehrere Klassenladeprogramme verwendet) wird empfohlen, die ClassLoader
von zurückgegebene Anwendung zu verwenden, Thread.currentThread().getContextClassLoader()
damit Sie auch außerhalb des Webanwendungskontexts suchen können.
Eine weitere Alternative in Webapps ist das ServletContext#getResource()
und sein Gegenstück ServletContext#getResourceAsStream()
. Es kann auf Dateien zugreifen, die sich im öffentlichen web
Ordner des Webapp-Projekts befinden, einschließlich des /WEB-INF
Ordners. Das ServletContext
ist in Servlets durch die geerbte getServletContext()
Methode verfügbar , Sie können es so wie es ist aufrufen.
Siehe auch:
getResourceAsStream
ist der richtige Weg für Web-Apps (wie Sie bereits gelernt haben).Der Grund dafür ist, dass das Lesen aus dem Dateisystem nicht funktioniert, wenn Sie Ihre Web-App in eine WAR-Datei packen. Dies ist der richtige Weg, um eine Web-App zu verpacken. Auf diese Weise ist es portabel, da Sie nicht von einem absoluten Dateipfad oder dem Speicherort Ihres App-Servers abhängig sind.
quelle
FileInputStream lädt den Dateipfad, den Sie als Relativ an den Konstruktor übergeben, aus dem Arbeitsverzeichnis des Java-Prozesses. Normalerweise ist dies in einem Webcontainer so etwas wie der
bin
Ordner.getResourceAsStream()
lädt einen Dateipfad relativ aus dem Klassenpfad Ihrer Anwendung .quelle
Die
FileInputStream
Klasse arbeitet direkt mit dem zugrunde liegenden Dateisystem. Wenn die betreffende Datei dort nicht physisch vorhanden ist, kann sie nicht geöffnet werden. DiegetResourceAsStream()
Methode funktioniert anders. Es wird versucht, die Ressource mithilfeClassLoader
der Klasse zu finden und zu laden, für die sie aufgerufen wird. Auf diese Weise können beispielsweise injar
Dateien eingebettete Ressourcen gefunden werden.quelle
jar
Ihre Anwendung kennt das Dateiformat und seine Auswirkungen. Und in JavaClassLoader
könnte der Geeignete dieses Wissen haben, während eine Ebene diesFileInputStream
sicherlich nicht hat.classname.getResourceAsStream () lädt eine Datei über den Klassenladeprogramm classname. Wenn die Klasse aus einer JAR-Datei stammt, wird dort die Ressource geladen.
Mit FileInputStream wird eine Datei aus dem Dateisystem gelesen.
quelle
Ich bin hier, indem ich beide Verwendungen trenne, indem ich sie als File Read (java.io) und Resource Read (ClassLoader.getResourceAsStream ()) markiere.
Datei lesen - 1. Funktioniert auf dem lokalen Dateisystem. 2. Versucht, die aus dem aktuellen JVM-gestarteten Verzeichnis angeforderte Datei als Root zu suchen. 3. Ideal, wenn Dateien für die Verarbeitung an einem festgelegten Speicherort wie / dev / files oder C: \ Data verwendet werden.
Ressourcen lesen - 1. Arbeitet am Klassenpfad 2. Versucht, die Datei / Ressource im aktuellen oder übergeordneten Klassenladeprogramm zu finden. 3. Ideal, wenn Sie versuchen, Dateien aus gepackten Dateien wie War oder Jar zu laden.
quelle