如何从java类中读取文件,两者都在同一个jar中

har*_*hit 2 java jar

我在jar中有以下结构

myjar.jar - > com - > MYProgram.class

       -> file.txt
Run Code Online (Sandbox Code Playgroud)

在MYProgram中,我想做:

getClass().getResourceAsStream("../file.txt")
Run Code Online (Sandbox Code Playgroud)

当我尝试读取输入流时,我得到NullpointerException.

哪里出错了?

Jon*_*eet 7

要么使用

getClass().getResourceAsStream("/file.txt")
Run Code Online (Sandbox Code Playgroud)

要么

getClass().getClassLoader().getResourceAsStream("file.txt")
Run Code Online (Sandbox Code Playgroud)

(ClassLoader.getResourceAsStream始终采用"绝对"资源名称.)

我不相信导航"目录层次结构"的工作原理getResourceAsStream- 路径要么必须是相对于给定的类,而不是导航备份树,要么必须绝对开始.


Mar*_*ers 5

尝试绝对路径:

getClass().getResourceAsStream("/file.txt")
Run Code Online (Sandbox Code Playgroud)

Javadoc getResourceAsStream说:

  • 如果名称以'/'('\ u002f')开头,则资源的绝对名称是'/'后面的名称部分.
  • 否则,绝对名称具有以下形式:

        modified_package_name/name
    
    Run Code Online (Sandbox Code Playgroud)

    其中modified_pa​​ckage_name是此对象的包名称,其中'/'替换为'.' ( '\ u002e').

这会把你的路径变成这条绝对的路径:

/com/../file.txt
Run Code Online (Sandbox Code Playgroud)

我不认为..符号是受到尊重的.它确实寻找上述绝对路径.