我在使用docker容器加载Java jar类路径中的JSON文件时遇到FileNotFoundException,它是一个Spring-Boot应用程序。此JSON文件在资源文件夹中可用。我能够在./target/classes/path下的docker中看到JSON文件。
Resource resource = resourceLoader.getResource("classpath:folderNm/file.json");
HashMap<String, String> headerMapping = (HashMap<String, String>) parser.parse(new FileReader(resource.getFile().getAbsolutePath()));
但是我得到了这个例外:
java.io.FileNotFoundException: class path resource [folderNm/file.json] cannot be resolved to absolute file path because it does not reside in the file system: jar:file:/app.jar!/folderNm/file.json
我试过了
- > qazxsw poi - > resource.getFile().getPath();
- >“resource.getFile().getCanonicalPath();
”(硬编码文件路径位置) - >“qazxsw poi”(硬编码文件路径位置)
./target/classes/folderName/fileName
以上都没有运行。请建议一种解决此问题的方法。
假设在maven结构中(你正在使用maven,对吧?)你的文件位于/app.jar!/folderNm/file.json
,你传递给InputStream inputStream = getClass().getResourceAsStream("xyz.json");
BufferedReader br = new BufferedReader(new InputStreamReader(inputStream, "UTF-8"));
StringBuilder responseStrBuilder = new StringBuilder();
String inputStr;
while ((inputStr = br.readLine()) != null)
responseStrBuilder.append(inputStr);
的路径应该是/folderName/file.json
实际上一切都在src/main/resources/folderName/file.json
中解释:
在委派之前,使用此算法从给定资源名称构造绝对资源名称:
- 如果名称以'/'('\ u002f')开头,则资源的绝对名称是'/'后面的名称部分。
- 否则,绝对名称的格式如下:modified_package_name / name
其中modified_package_name是此对象的包名称,其中'/'替换为'。' ( '\ u002e')。
基本上如果你跳过前面的'/',它会在你的类的包中查找folderName。以下代码对我来说很好:
getResourceAsStream
假设我在src / main / resources / folderName中有我的file.json。我不认为它与docker有任何关系。顺便说一句,我认为你可以使用javadocs来帮助将InputStream转换为String。
创建文件:
InputStream inputStream = StackTest.class.getResourceAsStream("/folderName/file.json");
BufferedReader br = new BufferedReader(new InputStreamReader(inputStream, "UTF-8"));
StringBuilder responseStrBuilder = new StringBuilder();
String inputStr;
while ((inputStr = br.readLine()) != null)
responseStrBuilder.append(inputStr);
System.out.println(responseStrBuilder.toString());
加载InputStream:
Apache Commons IOUtils.toString