I would like to know the best way of loading a resource in Java:
this.getClass().getResource() (or getResourceAsStream())
,Thread.currentThread().getContextClassLoader().getResource(name)
,System.class.getResource(name)
.
I would like to know the best way of loading a resource in Java:
this.getClass().getResource() (or getResourceAsStream())
,Thread.currentThread().getContextClassLoader().getResource(name)
,System.class.getResource(name)
.
Work out the solution according to what you want...
There are two things that
getResource
/getResourceAsStream()
will get from the class it is called on...So if you do
it will attempt to load foo.txt from the same package as the "this" class and with the class loader of the "this" class. If you put a "/" in front then you are absolutely referencing the resource.
will load the resource from the class loader of "this" and from the x.y.z package (it will need to be in the same directory as classes in that package).
will load with the context class loader but will not resolve the name according to any package (it must be absolutely referenced)
Will load the resource with the system class loader (it would have to be absolutely referenced as well, as you won't be able to put anything into the java.lang package (the package of System).
Just take a look at the source. Also indicates that getResourceAsStream just calls "openStream" on the URL returned from getResource and returns that.
Well, it partly depends what you want to happen if you're actually in a derived class.
For example, suppose
SuperClass
is in A.jar andSubClass
is in B.jar, and you're executing code in an instance method declared inSuperClass
but wherethis
refers to an instance ofSubClass
. If you usethis.getClass().getResource()
it will look relative toSubClass
, in B.jar. I suspect that's usually not what's required.Personally I'd probably use
Foo.class.getResourceAsStream(name)
most often - if you already know the name of the resource you're after, and you're sure of where it is relative toFoo
, that's the most robust way of doing it IMO.Of course there are times when that's not what you want, too: judge each case on its merits. It's just the "I know this resource is bundled with this class" is the most common one I've run into.
I tried a lot of ways and functions that suggested above, but they didn't work in my project. Anyway I have found solution and here it is:
I search three places as shown below. Comments welcome.
I know it really late for another answer but I just wanted to share what helped me at the end. It will also load resources/files from the absolute path of the file system (not only the classpath's).