wypracować rozwiązania według tego, co chcesz ...
Są dwie rzeczy, które getResource
/getResourceAsStream()
dostaną z klasy to nazywa się na ...
- Ładowarka klasa
- Pozycja początkowa
Więc jeśli nie
this.getClass().getResource("foo.txt");
spróbuje załadować plik foo.txt z tego samego pakietu co klasa "this" oraz z programu ładującego klasy "this" class. Jeśli umieścisz "/" z przodu, to bezwzględnie odwołasz się do zasobu.
this.getClass().getResource("/x/y/z/foo.txt")
będzie załadować zasobu z ładowaczem klasy „to” i od pakietu x.y.z (to będzie musiał być w tym samym katalogu co klasach w tym pakiecie).
Thread.currentThread().getContextClassLoader().getResource(name)
będzie ładować z ładowarki klasy kontekstu, ale nie rozwiąże nazwę według dowolnego pakietu (to musi być absolutnie odwoływać)
System.class.getResource(name)
załaduje zasobu z ładowaczem systemu klasy (to byłoby muszą być bezwzględnie odwoływane, ponieważ nie będzie można umieścić niczego w pakiecie java.lang (pakiet System).
Wystarczy spojrzeć na źródło.Wskazuje również, że getResourceAsStream po prostu wywołuje "openStream" na URL zwróconym przez getResource i zwraca to.
Nazwy pakietów AFAIK nie mają znaczenia, jest to ścieżka klasy programu ładującego klasy. –
@Bart, jeśli spojrzysz na kod źródłowy, zauważysz, że nazwa klasy ma znaczenie, gdy wywołujesz getResource na klasie. Pierwszą rzeczą, jaką robi to wywołanie, jest wywołanie "resolveName", które dodaje prefiks pakietu, jeśli jest to właściwe. Javadoc dla resolveName to "Dodaj prefiks nazwy pakietu, jeśli nazwa nie jest bezwzględna Usuń wiodącą"/", jeśli nazwa jest absolutna" –
Ah, widzę. Bezwzględny tutaj oznacza raczej względem ścieżki klasowej, a nie bezwzględny system plików. –