为了给自己添堵,我把一台笔记本的开发环境装成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文件涉及到的工具主要包括qemu-img、losetup以及VMware的vmdk-tools。这些工具为Linux用户提供了一个桥梁,使他们能在非VMware环境中直接访问和操作.vmdk文件。理解并掌握这些工具的使用,...
"Linux上加载Windows文件系统的两种方法" 在 Linux 操作系统中,我们经常需要加载 Windows 文件系统,以便读取或写入 Windows 分区中的文件。在这篇文章中,我们将介绍在 Linux 平台上加载 Windows 文件系统的两种...
Linux内核模块加载顺序控制是Linux操作系统中一项关键技术,它决定了内核模块按照何种顺序被加载到内核中。本文将从多个角度阐述内核模块加载顺序的控制机制,包括模块的顺序声明、内核模块加载顺序控制的原理、内核...
驱动文件名为cpq_cciss-3.6.26-5.rhel5.i686.dd.gz,解压成**.dd格式, ...找一台Linux机器,把文件拷贝到/tmp,U盘的设备名为sdb, 使用命令dd if=/tmp/megaraid_sas.img of=/dev/sdb, 具体如下:
加载完成后,提示是否再加载其他存储驱动,如果已经加载完则选择 NO,加载光盘到 boot:,linux dd 加载驱动正在加载 usb-storage 驱动询问是否要加载驱动选择 yes,选择 sda 设备 usb 设备都是被识别为 SCSI 设备...
本文将详细讲解Linux文件过滤驱动的原理、实现方法以及编译和加载过程。 文件过滤驱动的核心功能是在文件系统的I/O操作(如打开、读取、写入、关闭等)发生时插入一个中间层。当用户空间应用程序尝试进行文件操作时...
本项目名为“Linux下一个简单的文件系统实现”,其核心是一个名为XORFS(意为“或许很强大”)的自定义文件系统。这个项目的目标是让学习者了解文件系统的基本原理,并且通过实际操作来理解Linux内核中的虚拟文件...
Linux操作系统是现在流行的一种免费的...在研究了Linux文件系统及网络传输的原理基础上系统主要实现了对文件的管理,包括创建、删除、重命名、复制、移动和文件权限的修改的功能,以及对字符的搜索和对文件的网络传输。
在Linux系统启动过程中,ELF文件被加载到内存中执行。加载器首先解析ELF头,获取程序的入口点、依赖的动态库等信息,然后将各个节区映射到内存,并处理重定位信息,使得程序可以在指定的内存位置正确执行。 Linux的...
在 Linux 下加载 C++ 静态库主要涉及以下几种方式: - **放置到系统默认搜索路径中:**将所需的 `.so` 文件放入 `/usr/lib` 或 `/lib` 等目录。 - **修改 `ld.so.conf` 文件:**编辑 `/etc/ld.so.conf` 文件,添加...
Zynq-7000 soc 可以通过三种方式加载Programming Logic(PL)文件1. Fsbl通过xilinx SDK加载bit文件,通过xilinx ->...3. Linux结合第二种方式,在linux系统启动后,通过动态加载的办法加载bit文件,操作简单,利于调试。
程序功能:通过glx将x11和sdl创建的窗口联系起来(不是sdl-opengl的东西)供opengl渲染显示的小程序,其中bmp的是通过分析bmp文件格式读取位图数据和sdl_image两种方式加载,Png和Jpg文件格式比较复杂,所以直接使用...
动态链接库允许我们在运行时加载代码,而不是在编译时,这有助于减少应用程序的大小和提高资源利用率。 首先,我们需要理解Linux下的动态链接库。在Linux中,动态链接库文件通常以`.so`(共享对象)为扩展名。例如...
在这里,我们将led_drv.c驱动程序文件拷贝到Linux内核的driver/char文件夹下。 其次,需要修改Makefile文件以告诉编译器编译我们的驱动程序文件。在Makefile文件中添加一行代码,以告诉编译器编译led_drv.c文件并...
Linux连接器与加载器是操作系统中负责将编译后的程序代码转换为可执行程序的两个重要组件。它们在整个软件开发流程中起着至...以上这些内容为我们提供了深入理解Linux下程序开发与运行的底层原理提供了必要的知识框架。
### 嵌入式Linux下基于CGI的文件上传下载实现 #### 1. 概述 随着嵌入式Linux的深入研究和发展,其在各领域的应用变得越来越广泛。嵌入式Linux是一种针对特定应用场景进行了裁剪和优化的Linux版本,能够适应资源...
首先,"uImage" 是Linux社区广泛使用的内核映像文件格式,它通常包含了编译好的内核二进制代码以及可能的启动加载器信息。"nfs"则表示该内核映像是为了在网络文件系统(Network File System)上运行而设计的。NFS是...
在这个场景下,我们可以使用SMB(Server Message Block)协议,这是一种网络文件共享协议,常见于Windows系统,但同样可以应用于Linux环境。Java中有一个名为jcifs的库,它允许我们通过SMB接口来操作远程文件系统。 ...
总结来说,Linux下读取和写入ini文件涉及到基本的文件I/O操作、字符串解析和数据结构管理。根据具体需求,可以选择使用标准库函数,或者利用现成的编程语言库,以高效、安全的方式处理ini文件。
使用文件来模拟外存,进行数据结构设计和操作算法的设计,实现一个文件系统并实现基本的文件操作(为了简便文件系统,不考虑文件共享,文件系统安全以及管道文件与设备文件等特殊内容)。要求: 1、对程序的每一部分...