`

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驱动

    加载完成后,提示是否再加载其他存储驱动,如果已经加载完则选择 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连接器与加载器

    Linux连接器与加载器是操作系统中负责将编译后的程序代码转换为可执行程序的两个重要组件。它们在整个软件开发流程中起着至...以上这些内容为我们提供了深入理解Linux下程序开发与运行的底层原理提供了必要的知识框架。

    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是...

    linux 环境下安装maven 拉去资源设置 settings.xml 配置文件

    linux 环境下安装maven 拉去资源jar settings.xml 配置文件

Global site tag (gtag.js) - Google Analytics