`

关于资源路径的实验小结

阅读更多

   java中关于获取程序运行时资源路径的方法,在iteye中搜索到了几个。下面我对这几种写法做个实验。

说明:实验分直接编译运行和用fat jar打成包后运行两部分,因为我相信这个定位资源的问题正是在打包后和在linux服务器上运行时才会遇到的。Eclipse工程名testjar,位于E:\Java\Workspaces\,工程内只有一个类dut.ir.TestJar,资源文件1位于dut/ir/。fat jar选项不选One-Jar。

 

先来看Class.getResource()方法

public class TestJar
{
    public static void main(String[] args)
    {
        System.out.println(TestJar.class.getResource(资源名));
    }
}

  如果资源名填"/",Eclipse里运行时这个方法返回“file:/E:/Java/Workspaces/testjar/bin/”,而在打包后运行时返回null;

  如果资源名填"",Eclipse里运行返回“file:/E:/Java/Workspaces/testjar/bin/dut/ir/”,而在打包后运行则返回“jar:file:/E:/Java/Workspaces/testjar/testjar_fat.jar!/dut/ir/”,也就是类所在的完整路径(文件系统路径+包路径);

  如果资源名以'/'开头,如"/dut/ir/1",Eclipse运行结果“file:/E:/Java/Workspaces/testjar/bin/dut/ir/1”,打包运行结果则是“jar:file:/E:/Java/Workspaces/testjar/testjar_fat.jar!/dut/ir/1”,也就是说在包结构的根位置寻找,若资源名写“/1”或"/ir/1"是找不到的;

  如果资源名不以'/'开头,如"1",Eclipse运行结果“file:/E:/Java/Workspaces/testjar/bin/dut/ir/1”,打包运行结果则是“jar:file:/E:/Java/Workspaces/testjar/testjar_fat.jar!/dut/ir/1”,也就是说在类所在的位置上寻找,若资源名写"dut/ir/1"就意味着定位dut/ir/dut/ir/1,当然找不到;

 

    再实验TestJar.class.getClassLoader().getResource(资源名),ClassLoader.getSystemResource(资源名)和Thread.currentThread().getContextClassLoader().getResource(资源名)方法,它们的结果和TestJar.class.getResource("/" + 资源名)相同。关于原因,这在jdk中Class.getResource方法的说明

写道
此方法委托给此对象的类加载器。如果此对象通过引导类加载器加载,则此方法将委托给 ClassLoader.getSystemResource(java.lang.String)。

 

    那么,如果想在jar包所在的位置定位资源怎么办?再看看这几个方法:

System.out.println(System.getProperty("user.dir"));
System.out.println(System.getProperty("java.class.path"));
System.out.println(new File("").getAbsolutePath());
System.out.println(TestJar.class.getProtectionDomain().getCodeSource().getLocation().getFile());

 输出

E:\Java\Workspaces\testjar
E:\Java\Workspaces\testjar\bin
E:\Java\Workspaces\testjar
/E:/Java/Workspaces/testjar/bin/

 如此,可以利用System.getProperty("user.dir")或new File("").getAbsolutePath()这两种写法。

 

    注意:我这里都是直接引用类来实验这些方法,而没有实例化。进来看过的学长如有指正敬请回复,多谢!

0
0
分享到:
评论

相关推荐

    数据挖掘之神经网络分析实验报告.doc

    四、实验总结 本次实验是两人(周越和廖伯成)组队完成的(分工说明见"分工说明.txt"文件)。在 实验之前,有两项准备花费了我们大量的时间,分别是安装SQL SERVER 2008(SQL SERVER因为少了一些组件安装不成功),...

    C++实验报告(4).doc

    步骤如下: (1)通过"资源管理器"或"我的电脑",按文件路径找到已有源程序test.cpp。 (2)双击"test.cpp"图标,进入Visual C++集成环境,打开test.cpp。 (3)在test.cpp基础上将源程序修改为一下内容: #include...

    java教学资料

    高校java初级入门教学资源。熟悉并设置JDK path 路径 熟悉eclipse开发环境。 要求同学们在开发环境中,创建一个以姓名和学号命名的工程名称,如zhangsan04010325; 在工程下的src目录下创建15个类包,如ex1,ex2…ex15...

    ctf总结.md

    自己在做CTF过程中做的总结下面中实验室指的是网络安全实验室 题目全部来自bugku,南邮和网络安全实验室,题较基础,实验吧要复杂些 文中所有知识点内容并不全,要学习原理及深入得自己去找资源学习 看这个的时候,...

    Java数据结构和算法中文第二版(1)

    小结 问题 第2章 数组 Array专题Applet Java中数组的基础知识 将程序划分成类 类接口 Ordered专题applet 有序数组的Java代码 对数 存储对象 大O表示法 为什么不用数组表示一切? 小结 问题 实验 ...

    《TCP/IP详解,卷1:协议》

    1.17 小结 13 第2章 链路层 15 2.1 引言 15 2.2 以太网和IEEE 802封装 15 2.3 尾部封装 17 2.4 SLIP:串行线路IP 17 2.5 压缩的SLIP 18 2.6 PPP:点对点协议 18 2.7 环回接口 20 2.8 最大传输单元MTU 21 2.9 路径MTU...

    TCP-IP详解卷1:协议

    1.17 小结 13 第2章 链路层 15 2.1 引言 15 2.2 以太网和IEEE 802封装 15 2.3 尾部封装 17 2.4 SLIP:串行线路IP 17 2.5 压缩的SLIP 18 2.6 PPP:点对点协议 18 2.7 环回接口 20 2.8 最大传输单元MTU 21 2.9 路径MTU...

    TCP_IP详解卷1

    1.17 小结 13 第2章 链路层 15 2.1 引言 15 2.2 以太网和IEEE 802封装 15 2.3 尾部封装 17 2.4 SLIP:串行线路IP 17 2.5 压缩的SLIP 18 2.6 PPP:点对点协议 18 2.7 环回接口 20 2.8 最大传输单元MTU 21 2.9 路径MTU...

    TCPIP详解卷[1].part04

    1.17 小结 13 第2章 链路层 15 2.1 引言 15 2.2 以太网和IEEE 802封装 15 2.3 尾部封装 17 2.4 SLIP:串行线路IP 17 2.5 压缩的SLIP 18 2.6 PPP:点对点协议 18 2.7 环回接口 20 2.8 最大传输单元MTU 21 2.9 路径MTU...

    TCPIP详解卷[1].part09

    1.17 小结 13 第2章 链路层 15 2.1 引言 15 2.2 以太网和IEEE 802封装 15 2.3 尾部封装 17 2.4 SLIP:串行线路IP 17 2.5 压缩的SLIP 18 2.6 PPP:点对点协议 18 2.7 环回接口 20 2.8 最大传输单元MTU 21 2.9 路径MTU...

    TCPIP详解卷[1].part05

    1.17 小结 13 第2章 链路层 15 2.1 引言 15 2.2 以太网和IEEE 802封装 15 2.3 尾部封装 17 2.4 SLIP:串行线路IP 17 2.5 压缩的SLIP 18 2.6 PPP:点对点协议 18 2.7 环回接口 20 2.8 最大传输单元MTU 21 2.9 路径MTU...

    TCPIP详解卷[1].part06

    1.17 小结 13 第2章 链路层 15 2.1 引言 15 2.2 以太网和IEEE 802封装 15 2.3 尾部封装 17 2.4 SLIP:串行线路IP 17 2.5 压缩的SLIP 18 2.6 PPP:点对点协议 18 2.7 环回接口 20 2.8 最大传输单元MTU 21 2.9 路径MTU...

    TCP/IP详解part_2

    1.17 小结 13 第2章 链路层 15 2.1 引言 15 2.2 以太网和IEEE 802封装 15 2.3 尾部封装 17 2.4 SLIP:串行线路IP 17 2.5 压缩的SLIP 18 2.6 PPP:点对点协议 18 2.7 环回接口 20 2.8 最大传输单元MTU 21 2.9 路径MTU...

    TCPIP详解卷[1].part08

    1.17 小结 13 第2章 链路层 15 2.1 引言 15 2.2 以太网和IEEE 802封装 15 2.3 尾部封装 17 2.4 SLIP:串行线路IP 17 2.5 压缩的SLIP 18 2.6 PPP:点对点协议 18 2.7 环回接口 20 2.8 最大传输单元MTU 21 2.9 路径MTU...

    TCPIP详解卷[1].part11

    1.17 小结 13 第2章 链路层 15 2.1 引言 15 2.2 以太网和IEEE 802封装 15 2.3 尾部封装 17 2.4 SLIP:串行线路IP 17 2.5 压缩的SLIP 18 2.6 PPP:点对点协议 18 2.7 环回接口 20 2.8 最大传输单元MTU 21 2.9 路径MTU...

    TCPIP详解卷[1].part12

    1.17 小结 13 第2章 链路层 15 2.1 引言 15 2.2 以太网和IEEE 802封装 15 2.3 尾部封装 17 2.4 SLIP:串行线路IP 17 2.5 压缩的SLIP 18 2.6 PPP:点对点协议 18 2.7 环回接口 20 2.8 最大传输单元MTU 21 2.9 路径MTU...

    TCPIP详解卷[1].part03

    1.17 小结 13 第2章 链路层 15 2.1 引言 15 2.2 以太网和IEEE 802封装 15 2.3 尾部封装 17 2.4 SLIP:串行线路IP 17 2.5 压缩的SLIP 18 2.6 PPP:点对点协议 18 2.7 环回接口 20 2.8 最大传输单元MTU 21 2.9 路径MTU...

    TCPIP详解卷[1].part07

    1.17 小结 13 第2章 链路层 15 2.1 引言 15 2.2 以太网和IEEE 802封装 15 2.3 尾部封装 17 2.4 SLIP:串行线路IP 17 2.5 压缩的SLIP 18 2.6 PPP:点对点协议 18 2.7 环回接口 20 2.8 最大传输单元MTU 21 2.9 路径MTU...

    TCPIP详解卷[1].part10

    1.17 小结 13 第2章 链路层 15 2.1 引言 15 2.2 以太网和IEEE 802封装 15 2.3 尾部封装 17 2.4 SLIP:串行线路IP 17 2.5 压缩的SLIP 18 2.6 PPP:点对点协议 18 2.7 环回接口 20 2.8 最大传输单元MTU 21 2.9 路径MTU...

Global site tag (gtag.js) - Google Analytics