Laden von Dateien mit dem ClassLoader
Dieses problem wurde Lauschangriff mich für eine Weile. Ich habe zum laden ein paar Dateien in meinen java-app, und der einzige Weg, ich hab die Arbeit so weit sieht wie folgt aus:
URL hsURL;
if(System.getProperty("os.name").toLowerCase().contains("windows")) {
hsURL = new URL("file:/" + System.getProperty("user.dir") + "/helpsets/helpset.hs");
}
else {
hsURL = new URL("file://" + System.getProperty("user.dir") + "/helpsets/helpset.hs");
}
Aber das ist hässlich und schrecklich. Für eine Weile dachte ich, ich hätte diese arbeiten:
hsURL = ClassLoader.getSystemResource("helpsets/helpset.hs");
Aber das funktioniert nicht mehr aus irgendeinem Grund (ich muss etwas verändert haben und nicht bemerkt. Es gibt null zurück.
Soll ich mich mit getResource() anstelle von getSystemResource() (wenn ja, warum ist getSystemResource() static aber nicht getResource())?
Ich bin mit eclipse und ich habe versucht, einschließlich der Ordner in den build-Pfad (classpath) und nicht wie es ist, es scheint nicht, einen Unterschied zu machen.
InformationsquelleAutor twolfe18 | 2009-07-13
Du musst angemeldet sein, um einen Kommentar abzugeben.
getSystemResource
ist statisch, da wird es mit dem system classloader, die verfügbar ist statisch. (ClassLoader.getSystemClassLoader
)Wenn Ihr Ressource ist verfügbar in den classpath, ich würde vorschlagen, mit
ClassLoader.getResource()
oderClass.getResource
aus einer entsprechenden Klasse, z.B.(
ClassLoader.getResource
ist "absolute";Class.getResource
relativ zum package der Klasse, es sei denn, Sie Präfix mit einem '/'.)Wenn das nicht funktioniert, poste bitte, wie die app konfiguriert ist in Bezug auf den classpath, wo deine Datei ist.
EDIT: normalerweise finde ich die URL weniger nützlich, als eine
InputStream
, so dass ich mitgetResourceAsStream
stattgetResource
. YMMVWenn Sie interessiert sind, nur der Inhalt, sind Sie wahrscheinlich besser dran mit getResourceAsStream() auf den ClassLoader
gut, ich habe nicht bekommen, diese funktioniert noch. ich versuche, eine Datei zu laden, die in einem anderen Paket als die Klasse, die ich bin laden aus, also brauche ich eine Art absolute Referenz.
Ja, also mit "/helpsets/helpset.hs" wie gezeigt, in der Antwort. @Rich: ja, zu Bearbeiten, zu erwähnen, dass.
in den Projekt Ordner gibt es das source-Paket und die helpsets Paket. das source-Paket ist so eingerichtet: src/foo/bar/my_class
InformationsquelleAutor Jon Skeet
Die Sie erwähnt haben verschiedene Dinge hier, also lassen Sie uns Sortieren Sie Sie heraus.
1) Erstellen eines "file:" - URL, basierend auf "Benutzer.dir"
"User.dir" - Eigenschaft bezieht sich auf das aktuelle Arbeitsverzeichnis wird -- wo der Benutzer hätte, wenn er/Sie begonnen, die app. Die Chancen stehen gut, dass die Dateien hier geschrieben wird verschwinden zwischen den beiden läuft (weil der Benutzer möglicherweise von einem anderen Verzeichnis).
"User.home" - Eigenschaft bezieht sich auf das user-home-directory -- die bleiben die gleichen, die zwischen läuft.
In jedem Fall, verwenden Sie eine Datei-Objekt, um Dateien zu öffnen, nicht der dreck mit sich herum, die Schaffung einer "file:" - URL an. Sie erhalten keinen nutzen, und wie Sie sehen können, Sie haben zu schreiben, chaotisch-code zugreifen können.
2) Abrufen einer Ressource, die über den classloader
Dies ist gedacht, um Dateien, die verpackt sind mit Ihrer Anwendung -- nur-lese-Dateien. Wie Sie gesehen haben, gibt es mehrere Varianten. Ich bevorzuge die folgende, denn ich gehe davon aus, dass eine Klasse laden will, dass eine Datei verpackt.
InformationsquelleAutor kdgregory