当使用Docker容器加载Java jar类path中的JSON文件时,面对FileNotFoundException,它是Spring-Boot应用程序。 此JSON文件在资源文件夹中可用。 能够在docker下的./target/classes/path下看到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
– > resource.getFile().getPath();
– > resource.getFile().getCanonicalPath();
– >“ ./target/classes/folderName/fileName
”(硬编码的FilePath位置) – >“/ /app.jar!/folderNm/file.json
”(硬编码的FilePath位置)
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);
上述方式都没有运行。 请build议一种方法来解决这个问题。
假设在maven结构中(你使用的是maven,对吗?)你的文件位于src/main/resources/folderName/file.json
,你传递给getResourceAsStream
的路径应该是/folderName/file.json
其实一切都是在javadocs中解释:
在委派之前,使用此算法从给定资源名称构建绝对资源名称:
- 如果名称以'/'('\ u002f')开始,那么资源的绝对名称是“/”后面的名称部分。
- 否则,绝对名称的格式如下:modified_package_name / name
其中modified_package_name是用“/”替代“。”的对象的包名。 ( '\ u002e')。
基本上,如果你跳过前面的“/”,它会在你的类的包中寻找folderName 。 以下代码适合我:
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());
假设我在src / main / resources / folderName中有我的file.json。 我不认为这与码头工人有任何关系。 顺便说一句,我想你可以使用Apache Commons IOUtils.toString ,帮助将InputStream转换为字符串。