简体   繁体   中英

How to specify relative file path in Java file so that it can still work after the file is put in jar file?

Suppose I have a Java class that needs to access a file with absolute path /home/gem/projects/bar/resources/test.csv:

package com.example
class Foo {
String filePath = ????? // path to test.csv
String lines = FileInputStream(new File(filePath).readAllLines();

}

Where the path to Foo.java is /home/gem/projects/bar/src/com/example.

Of course I cannot specify absolute path to the resource file. This is because jar file will be distributed as library for any clients to use in their own environments.

Assume the resource file like test.csv is always in the same path relative to project root. When a jar is created containing Foo.class, this jar also contains test.csv in the same relative path ( relative to project root).

What is the way to specify relative path that would work no matter where the project bar is moved to? Also how can I create a jar file (which can be in any location) so that the path to the resource file test.csv would still be correct.

To keep things simple, I have used invalid Java API ( readAllLines() which reads all the lines and return a string containing entire file content. Also not using try/catch).

Assume csv file can be read as well as written to.

I hope this makes it clear now.

Put the test.csv file into the src folder and use this:

Foo.class.getResourceAsStream("/test.csv")

To get an InputStream for the file. This will work wherever the project is moved, including packaged as a JAR file.

Example:

ProjectX\\src\\Test.java

ProjectX\\resources\\config.properties

If you have the above structure and you want to use your config.properties file, this is how you do it:

InputStream input = new FileInputStream("./resources/config.projects");

In this example you don't have to worry about packaging your source into jar file. You can still modify your resources folder anytime.

使用getResource()如图所示这里

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM