Java 无法使用相对路径从资源文件夹获取JSON文件
我正在尝试使用相对路径从主方法中的资源文件夹中获取JSON文件。代码使用绝对路径工作,但是一旦我从我想要的项目中构建了一个jar文件,这就会中断Java 无法使用相对路径从资源文件夹获取JSON文件,java,maven,jar,resources,inputstream,Java,Maven,Jar,Resources,Inputstream,我正在尝试使用相对路径从主方法中的资源文件夹中获取JSON文件。代码使用绝对路径工作,但是一旦我从我想要的项目中构建了一个jar文件,这就会中断 public static void main(String[] args) throws FileNotFoundException { // Read in database db = Database.read(Thread.currentThread().getContextClassLoader().getResource("JSON/inh
public static void main(String[] args) throws FileNotFoundException {
// Read in database
db = Database.read(Thread.currentThread().getContextClassLoader().getResource("JSON/inhabitants.json").toExternalForm());
names = db.getAllNames();
Read调用数据库中的一个方法,该方法使用inputstream读取文件
public static Database read(String filename) throws FileNotFoundException {
InputStream is = new FileInputStream(filename);
Reader reader = new InputStreamReader(is);
return gson.fromJson(reader, Database.class);
}
我得到的错误如下:
java.io.FileNotFoundException:
文件:/Users/timpelser/IdeaProjects/turphapp/target/classes/JSON/incidents.JSON
(没有这样的文件或目录)位于java.io.FileInputStream.open0(本机)
方法)在java.io.FileInputStream.open(FileInputStream.java:195)的
java.io.FileInputStream.(FileInputStream.java:138)位于
java.io.FileInputStream.(FileInputStream.java:93)位于
Main.Main(Main.java:51)处的Core.Database.read(Database.java:22)。。。
还有11个
目录/Users/timpelser/IdeaProjects/turphapp/target/classes/JSON/incidents.JSON中的文件
但是确实存在,所以我不知道出了什么问题
以下是我的文件夹结构(Maven基本结构):
有没有一个解决方案仍然可以让我将其部署为jar文件
编辑(25/09):如果使用getResourceAsStream而不是getResource,则会出现以下错误:
Caused by: java.io.FileNotFoundException: java.io.BufferedInputStream@4f8e5cde (No such file or directory)
at java.io.FileInputStream.open0(Native Method)
at java.io.FileInputStream.open(FileInputStream.java:195)
at java.io.FileInputStream.<init>(FileInputStream.java:138)
at java.io.FileInputStream.<init>(FileInputStream.java:93)
at Core.Database.read(Database.java:22)
at Main.main(Main.java:51)
... 11 more
原因:java.io.FileNotFoundException:java.io。BufferedInputStream@4f8e5cde(无此类文件或目录)
位于java.io.FileInputStream.open0(本机方法)
在java.io.FileInputStream.open(FileInputStream.java:195)
位于java.io.FileInputStream。(FileInputStream.java:138)
位于java.io.FileInputStream。(FileInputStream.java:93)
位于Core.Database.read(Database.java:22)
Main.Main(Main.java:51)
... 还有11个
您必须使用getResourceAsStream
从正在运行的jar中读取文件(其中包含src\main\resources
中的文件) 用这个
Resource resource = new classpathResource(json);
new ObjectMapper.readValue(resource.getInputStream(),Object.class);
仅供参考,为什么要将json文件放在目标文件夹中?目标是构建文件夹,每次执行mvn clean
时都会被删除。我不是故意这样做的,我只是将文件添加到资源文件夹中,在构建工件时,它将其添加到目标文件夹中。我使用GetResourceStream收到一个未找到文件异常。我不知道您使用的是哪个开发环境。如果您在Eclipse中运行它,那么Eclipse应该像处理jar中的调用一样处理这个调用,但是jar中有什么呢?然后,查找转到类路径,src\main\resources
必须位于类路径中!请检查您的场景中是否存在这种情况。(在Eclipse中右键单击src\main\resources
->“构建路径”->“用作源文件夹”)我使用的是IntelliJ Ultimate Edition,资源设置为默认资源文件夹。我不知道IntelliJ中的确切名称,但您还必须确保src\main\resources
位于类路径/源文件夹中!嗯,我不明白,因为类路径是src/main/resources,还是我不明白?