java - GetResource 和 google io Files 会导致 jar root 中的文件出现 FileNotFoundException

标签 java exception jar io resources

代码

Files.toString(new File(Thread.currentThread().getContextClassLoader().getResource(
    "login_commands.json").getFile()), Charsets.UTF_8)

异常

java.io.FileNotFoundException: file:\C:\application\target.jar!\login_commands.json (The filename, directory name, or volume label syntax is incorrect)

Jar结构

--根

  • login_commands.json
  • 等等

该代码在 IDE 中运行良好。

如何读取这个文件?

最佳答案

解决方案

使用

Thread.currentThread().getContextClassLoader().getResourceAsStream("login_commands.json")

相反

Thread.currentThread().getContextClassLoader().getResource("login_commands.json").getFile()
<小时/>

为什么?

当您使用getResource()时,类加载器尝试从<JAR_FOLDER>/YOUR_JAR.jar!login_commands.json获取您的文件。并且此路径对于创建 java.io.File 无效并抛出 FileNotFoundException

请注意,您的代码可以在 IDE 中运行,因为您的 IDE 有其自己的类加载器,当您调用 getResource 时,它会运行。或getResourceAsStream ,从 workspace/test/target/classes/login_commands.json 获取文件这是创建文件的有效路径。

关于java - GetResource 和 google io Files 会导致 jar root 中的文件出现 FileNotFoundException,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38475867/

相关文章:

java - ProGuard 不会混淆蓝牙类

java - 我可以在运行时替换 Spring bean 定义吗?

java - Activity 的实例变量未在 AsyncTask 的 onPostExecute 中设置或如何将数据从 AsyncTask 返回到主 UI 线程

java - 边界填充(洪水填充)算法构建交互式 map 。 java

php - Moodle session_start 返回 FALSE

java - 共享可执行的 .jar 文件

Scala - 正整数之和为负 - 溢出异常?

c# - 多次指定固定名称 System.Data.SqlClient 的提供程序

java - 在 eclipse 中编译 java 文件并将其添加到解压缩的 jar 并将 jar 重命名的方法是否正确?

java - 图像不会出现在 jar 中