2017-01-17 2 views
2

Ich habe kürzlich alten Code zum Lesen von Daten aus Dateien ausgegraben. Es erstellt einen Eingangsstrom wie folgt aus:Gibt es die richtigen Zugriffsunterschiede zwischen diesen beiden Möglichkeiten, einen InputStream zu erstellen?

InputStream stream = 
Thread.currentThread().getContextClassLoader().getResourceAsStream(filepath); 

filepath ist ein String hier. Für lokale Dateien funktionierte das gut, aber wenn ich versuchte, Dateien zu lesen, auf die ich auf einem freigegebenen Netzlaufwerk zugreifen konnte, würde ich eine Fehlermeldung erhalten, dass der Stream geschlossen wurde.

Ich habe stattdessen ein File-Objekt, und erstellt den Eingabestrom wie folgt statt:

InputStream stream = new FileInputStream(file); 

Jetzt funktioniert es perfekt. Aber ich bin sehr neugierig geworden. Es wurde vorgeschlagen, als ich meine ursprüngliche Codezeile hatte, dass die Datei einfach nicht existierte. Aber das Umschalten auf die zweite Codezeile ist eindeutig. Gibt es Einschränkungen bei den Zugangsrechten mit dem ersten Ansatz? Was ist der Unterschied zwischen ihnen? Warum kann nur der zweite auf die Datei zugreifen?

Antwort

4

Angenommen, Sie tun nichts schlaues mit Custom Class Loadern, die getResourceAsStream Methode auf dem Klassenlader verwendet die gleichen Regeln zum Laden der Ressource wie beim Laden von Klassen: Es werden nur Dateien auf dem Klassenpfad geladen.

Die Tatsache, dass Sie erhalten null bedeutet, dass die Datei, die Sie laden, nicht auf dem Klassenpfad ist. Dass es sich um ein freigegebenes Netzlaufwerk handelt, ist ein Ablenkungsmanöver.

+0

Süß. Danke vielmals. Jetzt weiß ich auch was ein Hering ist;). War für eine Sekunde verwirrt. – KjetilNordin

+0

Gern geschehen :) – StuPointerException

Verwandte Themen