PrinceCJC PrinceCJC - 6 months ago 19
Java Question

Reading a resource file from within jar

I have a problem with my game and I have search for many different things but just cannot find the answer I want.

So here it is, I would like to read a resource from within my jar like so:

File file;
file = new File(getClass().getResource("/file.txt").toURI());
BufferredReader reader = new BufferedReader(new FileReader(file));

//Read the file


and it works fine when running it in eclipse, but if I export it to a jar the run it there is an IllegalArgumentException:

Exception in thread "Thread-2"
java.lang.IllegalArgumentException: URI is not hierarchical


and I really don't know why but with some testing I found if I change

file = new File(getClass().getResource("/file.txt").toURI());


to

file = new File(getClass().getResource("/folder/file.txt").toURI());


then it works the opposite (it works in jar but not eclipse).

Please help and BTW I'm using eclipse and the folder with my file in is a class folder.

Answer

Rather than trying to address the resource as a File just ask the ClassLoader to return an InputStream for the resource instead via getResourceAsStream:

InputStream in = getClass().getResourceAsStream("/file.txt"); 
BufferedReader reader = new BufferedReader(new InputStreamReader(in));

As long as the file.txt resource is available on the classpath then this approach will work the same way regardless of whether the file.txt resource is in a classes/ directory or inside a jar.

The URI is not hierarchical occurs because the URI for a resource within a jar file is most likely going to look like something like this: file:/example.jar!/file.txt. You cannot read the entries within a jar (a zip file) like it was a plain old File.

This is explained well by the answers to:

Comments