Reading a resource file from within jar

2.6K    Asked by DaniloGuidi in Devops , Asked on Jul 5, 2021

 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).

I'm using Eclipse and the folder with my file is in a class folder.

Answered by Dipesh Bhardwaj

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 continued as the file.txt resource is accessible on the classpath then this approach will serve the same way regardless of whether the file.txt device is in a classes/ directory or inside a jar.

The URI is not hierarchical happens because the URI for a store within a jar file is going to look 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.



Your Answer

Answer (1)

To read a resource file from within a JAR file in Java, you can use the ClassLoader.getResourceAsStream() method or Class.getResourceAsStream() method. These methods allow you to obtain an InputStream representing the contents of the resource file.


Here's an example of how to read a resource file from within a JAR:

import java.io.IOException;
import java.io.InputStream;
import java.util.Scanner;
public class ReadResourceFromJar {
    public static void main(String[] args) {
        // Get the InputStream for the resource file
        InputStream inputStream = ReadResourceFromJar.class.getResourceAsStream("/path/to/resource/file.txt");
        if (inputStream != null) {
            try (Scanner scanner = new Scanner(inputStream)) {
                // Read the contents of the resource file
                while (scanner.hasNextLine()) {
                    String line = scanner.nextLine();
                    System.out.println(line);
                }
            } catch (IOException e) {
                e.printStackTrace();
            }
        } else {
            System.out.println("Resource not found!");
        }
    }
}

In this example:

Replace "/path/to/resource/file.txt" with the actual path to your resource file inside the JAR. The path should be relative to the root of the JAR file, and it should start with a /.

The getResourceAsStream() method returns an InputStream for the resource file. If the resource is not found, it returns null.

We use a Scanner to read the contents of the resource file line by line.

Make sure to handle exceptions that may occur during the reading process, such as IOException.

When you run this code, it will read the contents of the resource file from within the JAR and print them to the console.




6 Months

Interviews

Parent Categories