`

linux下加载文件资源好纠结呀

阅读更多
为了给自己添堵,我把一台笔记本的开发环境装成linux了,希望督促自己熟悉linux

可是我刚才发现在linux下,用java加载资源文件和在windows下还不一样,比在windows下面麻烦好多,烦死我了

比如在windows下面,假设在eclipse里建一个工程helloworld,目录结构是

helloworld

--- src
--- bin

我一般会把配置文件,比如spring.xml、logback.xml什么的都放在src目录下面,然后用
File file = new File("spring.xml");

就能加载到了

可是我刚才在linux下面,用相对路径死活就加载不到,必须要把文件放在helloworld目录下才可以

针对这个问题,上网搜索了好久,这里总结一下

定位资源文件有2种方式,一种是file system定位,另一种是classpath定位

一、file system定位:

这种比较简单,有2种情况
File file = new File("abc.txt");
File file = new File("/abc.txt");

第一种不以"/"开头的,是相对路径;第二种以"/"开头的,是绝对路径

绝对路径比较简单,在linux下就是/目录。但是我觉得绝对路径虽然很方便定位路径,但是完全不实用,因为基本上换个部署路径,绝对路径定位就不好使了

相对路径是从“工作目录”算起,所谓的“工作目录”,就是“启动JVM的目录”,或者说“执行java命令的目录”

比如说例子里的这个代码,如果在eclipse里执行的话,eclipse会在项目的根目录helloworld下执行java命令,所以这里的file路径就是/home/username/workspace/helloworld/abc.txt

如果在命令行里自己随便找个目录去执行,比如在/opt下执行java -cp /home/username/workspace/helloworld/bin xxx.xxx.xxx,那这个file的路径就变成了/opt/abc.txt

这个相对路径也不太靠谱,变来变去非常讨厌

二、classpath定位

我个人感觉,classpath定位就要好多了。因为配置文件往往是和代码一起部署的,相对位置一般也比较确定,不会因为安装目录变化,操作系统变化就改变

所以根据classpath来定位资源,我觉得是比较好的,下面举个例子:

1、classpath是/home/username/workspace/helloworld/bin/classes
2、有一个类的FQCN是net.kyfxbl.test.Main
3、在/home/username/workspace/helloworld/bin/classes下有一个111.test文件
4、在/home/username/workspace/helloworld/bin/classes/net/kyfxbl/test下有一个222.test文件

现在我就想通过classpath定位的方式,在Main这个类中把111.test和222.test给定位到。不管这个项目部署在哪里,只要上面说的目录结构不变就不影响

加载111.test的方法:

111.test是在classpath的根目录下,有2种办法都能加载到它
Main.class.getResourceAsStream("/111.test");

或者
Main.class.getClassLoader().getResourceAsStream("111.test");

Main.class.getResourceAsStream()方法是从这个类的包路径开始加载,而111.test是在classpath根路径下,所以要用这个方法加载的话,就需要在111.test前面加上"/"

而Main.class.getClassLoader().getResourceAsStream()方法本来就是从classpath根路径开始加载,所以直接写"111.test"就行了

加载222.test的方法:

222.test在Main类的包路径下,也有2种方法能加载它
Main.class.getResourceAsStream("222.test");

或者
Main.class.getClassLoader().getResourceAsStream("net/kyfxbl/test/222.test");

和上面的例子正好是相反的,就不重复解释了

总结:

1、加载文件有file system定位和classpath定位2种方式,我觉得classpath定位是更好的

2、不管哪种定位方式,其实都有绝对路径和相对路径的区别。只是classpath定位方式,根目录是确定的,就是classpath;而file system定位方式,根目录根本就不确定,这也是最大的问题

3、linux比windows麻烦

几个关键的概念:

1、classpath:类加载的根目录,一般就是project/bin,或者project/target/classes等;在tomcat里是WEB-INF/classes,和WEB-INF/lib

2、包路径:就是classpath之下的子目录,比如一个abc.def.Main的类,其包路径是classpath/abc/def

3、工作目录:这个是给file system用的,就是执行java命令的目录,完全不能确定。但是在eclipse里,一般就是project根目录

4、绝对路径和相对路径,在classpath定位和file system定位中都有的概念,以"/"打头的是绝对路径,会从根目录开始找;不以"/"打头的就是相对路径,会从当前目录开始找
分享到:
评论

相关推荐

    Linux 下加载 vmdk 的工具

    总结起来,Linux下加载vmdk文件涉及到的工具主要包括qemu-img、losetup以及VMware的vmdk-tools。这些工具为Linux用户提供了一个桥梁,使他们能在非VMware环境中直接访问和操作.vmdk文件。理解并掌握这些工具的使用,...

    linux内核模块加载顺序

    Linux内核模块加载顺序控制是Linux操作系统中一项关键技术,它决定了内核模块按照何种顺序被加载到内核中。本文将从多个角度阐述内核模块加载顺序的控制机制,包括模块的顺序声明、内核模块加载顺序控制的原理、内核...

    linux 加载raid驱动 dd文件写入U盘

    驱动文件名为cpq_cciss-3.6.26-5.rhel5.i686.dd.gz,解压成**.dd格式, ...找一台Linux机器,把文件拷贝到/tmp,U盘的设备名为sdb, 使用命令dd if=/tmp/megaraid_sas.img of=/dev/sdb, 具体如下:

    linux 加载raid驱动

    加载完成后,提示是否再加载其他存储驱动,如果已经加载完则选择 NO,加载光盘到 boot:,linux dd 加载驱动正在加载 usb-storage 驱动询问是否要加载驱动选择 yes,选择 sda 设备 usb 设备都是被识别为 SCSI 设备...

    linux下的文件过滤驱动

    本文将详细讲解Linux文件过滤驱动的原理、实现方法以及编译和加载过程。 文件过滤驱动的核心功能是在文件系统的I/O操作(如打开、读取、写入、关闭等)发生时插入一个中间层。当用户空间应用程序尝试进行文件操作时...

    Linux下一个简单的文件系统实现

    本项目名为“Linux下一个简单的文件系统实现”,其核心是一个名为XORFS(意为“或许很强大”)的自定义文件系统。这个项目的目标是让学习者了解文件系统的基本原理,并且通过实际操作来理解Linux内核中的虚拟文件...

    Java-Linux环境下OpenCV本机库文件

    在Windows操作系统下,本机库文件的扩展名通常是`.dll`(动态链接库),而在Linux操作系统下,本机库文件的扩展名通常是`.so`(共享对象)。这是由于不同操作系统使用不同的二进制格式和加载机制。 原因如下: 1. ...

    linux下文件管理系统的研究与实现

    Linux操作系统是现在流行的一种免费的...在研究了Linux文件系统及网络传输的原理基础上系统主要实现了对文件的管理,包括创建、删除、重命名、复制、移动和文件权限的修改的功能,以及对字符的搜索和对文件的网络传输。

    Linux加载windows字体

    Linux系统的字体库机制是通过/usr/share/fonts目录下的字体文件来实现的,而Windows字体库是存储在C:\WINDOWS\FONTS目录下的。通过加载Windows字体到Linux系统中,我们可以使用更多的字体来输出PDF,提高输出PDF的...

    Linux下Java开发环境搭建以及加载C++动态库方法

    在 Linux 下加载 C++ 静态库主要涉及以下几种方式: - **放置到系统默认搜索路径中:**将所需的 `.so` 文件放入 `/usr/lib` 或 `/lib` 等目录。 - **修改 `ld.so.conf` 文件:**编辑 `/etc/ld.so.conf` 文件,添加...

    Linux qtcreator动态加载动态链接库案例

    动态链接库允许我们在运行时加载代码,而不是在编译时,这有助于减少应用程序的大小和提高资源利用率。 首先,我们需要理解Linux下的动态链接库。在Linux中,动态链接库文件通常以`.so`(共享对象)为扩展名。例如...

    静态加载驱动到linux内核中

    在这里,我们将led_drv.c驱动程序文件拷贝到Linux内核的driver/char文件夹下。 其次,需要修改Makefile文件以告诉编译器编译我们的驱动程序文件。在Makefile文件中添加一行代码,以告诉编译器编译led_drv.c文件并...

    xilinx zynq PL(Programming Logic) 动态加载实现

    Zynq-7000 soc 可以通过三种方式加载Programming Logic(PL)文件1. Fsbl通过xilinx SDK加载bit文件,通过xilinx ->...3. Linux结合第二种方式,在linux系统启动后,通过动态加载的办法加载bit文件,操作简单,利于调试。

    linux下QT程序读写配置文件小程序

    这个例子中,我们将深入理解如何利用`QSettings`在Linux下创建一个简单的QT程序来读写配置文件。 首先,`QSettings`类是Qt库中的一个关键组件,它允许开发者以一种跨平台的方式处理配置文件。无论是Windows的注册表...

    linux下读写ini文件

    c++写的在linux下读写ini文件。 读 ini.openfile(path, "r"); ini.getstr(...); ini.closefile(); 写 ini.openfile(path, "w"); ini.setstr(...); ini.closefile();

    实现exe从资源中加载到内存中运行

    在Windows操作系统中,有时为了软件的安全性和便携性,开发者会尝试将可执行文件(exe)嵌入到主程序的资源中,然后在程序运行时动态地从资源中加载到内存并执行。这种方式避免了单独分发多个文件,也可以防止恶意...

    UNIX/LINUX 平台可执行文件加载过程

    UNIX/LINUX 平台可执行文件加载过程 本文讨论了 UNIX/LINUX 平台下三种主要的可执行文件格式: a.out(assembler and link editor output 汇编器和链接编辑器的输出)、 COFF(Common Object File Format 通用...

    嵌入式Linux下基于CGI的文件上传下载的实现

    ### 嵌入式Linux下基于CGI的文件上传下载实现 #### 1. 概述 随着嵌入式Linux的深入研究和发展,其在各领域的应用变得越来越广泛。嵌入式Linux是一种针对特定应用场景进行了裁剪和优化的Linux版本,能够适应资源...

    Linux内核映像文件

    首先,"uImage" 是Linux社区广泛使用的内核映像文件格式,它通常包含了编译好的内核二进制代码以及可能的启动加载器信息。"nfs"则表示该内核映像是为了在网络文件系统(Network File System)上运行而设计的。NFS是...

    JAVA下载远程Linux服务器的文件

    在这个场景下,我们可以使用SMB(Server Message Block)协议,这是一种网络文件共享协议,常见于Windows系统,但同样可以应用于Linux环境。Java中有一个名为jcifs的库,它允许我们通过SMB接口来操作远程文件系统。 ...

Global site tag (gtag.js) - Google Analytics