Heim  >  Artikel  >  Java  >  Einführung in die Verwendung von getResourceAsStream in Java

Einführung in die Verwendung von getResourceAsStream in Java

零下一度
零下一度Original
2017-07-18 18:04:182858Durchsuche

Die Verwendung von JAVA zum Abrufen von Dateien mag einfach klingen, aber für viele Neulinge wie mich ist die Beherrschung immer noch recht oberflächlich und die Erfahrung mit der Verwendung ist recht tiefgreifend. Die am häufigsten verwendete Methode ist die Verwendung der Dateiklasse von JAVA Um die Datei c:/test.txt zu erhalten, verwenden Sie File file = new File("c:/test.txt"); Was ist das Problem bei dieser Verwendung? Ich glaube, jeder weiß, dass der Pfad fest codiert ist Im JAVA-Geist sollte die Anwendung einmal erstellt und überall verfügbar sein. Aus praktischer Anwendungsperspektive wird die endgültig generierte Anwendung auch auf anderen Betriebssystemen als Windows bereitgestellt. Für Linux bedeutet die Verwendung der Wörter c:/ in der Anwendung einen Fehler . Daher sollten wir versuchen, harte Codierung zu vermeiden, das heißt, absolute Pfade direkt zu verwenden.

In der Servlet-Anwendung gibt es eine getRealPath(String str)-Methode. Obwohl diese Methode den Pfad der Datei auch dynamisch abrufen kann, ohne den absoluten Pfad direkt von Hand zu schreiben, wird diese Methode ebenfalls nicht empfohlen. , Welche Methoden müssen wir also haben, um Dateien besser zu bekommen?

Das sind die Methoden Class.getResource() und Class.getResourceAsStream(), aber viele Leute verstehen ihre Verwendung immer noch nicht, weil viele Leute ( Ich wusste zum Beispiel vor nicht allzu langer Zeit nicht, welche Parameter daran übergeben werden sollten. Natürlich haben einige Leute es bereits sehr gut genutzt, und diese Leute müssen sich nicht darum kümmern Sie kennen einige Parameter nicht oder sind nicht sehr gut darin. Jemand, der damit vertraut ist, kann es ein wenig erklären.

Zuallererst gibt es in Java die folgenden Arten von getResourceAsStream:

1. Class.getResourceAsStream(String path): Wenn der Pfad nicht mit „/“ beginnt, wird er verwendet aus dem Paket, in dem sich diese Klasse standardmäßig befindet. Ressourcen, die mit „/“ beginnen, werden aus dem

 ClassPath-Stammverzeichnis abgerufen. Es wird lediglich ein absoluter Pfad durch Pfad erstellt, und letztendlich wird die Ressource von ClassLoader abgerufen.

 2. Class.getClassLoader.getResourceAsStream(String path): Standardmäßig wird es vom ClassPath-Stamm abgerufen. Der Pfad darf nicht mit „/“ beginnen. Schließlich wird die Ressource durch

ClassLoader.

 3. ServletContext. getResourceAsStream(String path): Standardmäßig werden Ressourcen aus dem WebAPP-Stammverzeichnis abgerufen. Es spielt keine Rolle, ob der Pfad mit „/“ unter Tomcat beginnt Dies hängt natürlich mit der spezifischen Containerimplementierung zusammen.

4. Das in der Anwendung integrierte Objekt unter Jsp ist eine Implementierung des oben genannten ServletContext.


Übrigens die Klassenlader in JAVA:

Es gibt insgesamt drei Lader

Bootstrap-Klassenlader: Verantwortlich für das Laden von JAVA-Kernklassen ( jre Inhalte in den lib- und class-Verzeichnissen)

Erweiterungs-Klassenlader: Verantwortlich für das Laden von JAVA-Erweiterungsklassen (Inhalte im lib/ext-Verzeichnis unter jre)
System-Klassenlader: Verantwortlich für das Laden anwendungsspezifischer Klassen (Der im Klassenpfad der Umgebungsvariablen konfigurierte Inhalt)
Die Ladereihenfolge einer Klasse basiert ebenfalls auf der obigen Anordnung, um sicherzustellen, dass die Systemklasse zuerst geladen werden kann.

Gleichzeitig können Benutzer auch ihren eigenen ClassLoader definieren, um spezielle Ressourcen zu laden.

Dabei handelt es sich um den Unterschied zwischen Class.getClassLoader() und Thread.currentThread.getContextClassLoader().

Geben Sie ein einfaches Beispiel:

Angenommen, JAVA stellt uns eines Tages eine Klasse namens StartCamera zur Verfügung, um die Standardkamera des Computers zu starten, und packt diese Klasse in ein Glas.

Unter normalen Umständen müssen wir, wenn wir die Kamera starten möchten, nur dieses Glas im Klassenpfad konfigurieren. Der Klassenlader des Systems lädt diese Klasse beim Systemstart in die Anwendung.

Da es sich jedoch um unterschiedliche Kamerahersteller handelt, wird es für neue Geräte mehrere verschiedene StartCamera-Implementierungen geben. In der Anwendung wissen wir nicht, welche die tatsächlichen Benutzer verwenden werden. Deshalb haben wir einen ClassLoader angepasst, um die entsprechende StartCamera-Klasse für einen bestimmten Gerätetyp zu laden.

So sieht es aus: Laden Sie zuerst die von uns definierten Klassen und dann die Systemklassen, wenn sie nicht geladen werden können. Eine solche Anforderung kann durch den standardmäßigen

Lademechanismus des übergeordneten Delegaten

des Systems nicht erfüllt werden. Thread.currentThread.getContextClassLoader() wird auf diese Weise generiert. Wir verwenden Thread.currentThread.setContextClassLoader(), um den entsprechenden ClassLoader für den aktuellen Thread anzugeben, und rufen ihn dann mit get ab.

Das obige ist der detaillierte Inhalt vonEinführung in die Verwendung von getResourceAsStream in Java. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!

Stellungnahme:
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn