设为首页 收藏本站
查看: 293|回复: 0

[经验分享] linux下加载文件资源好纠结呀

[复制链接]

尚未签到

发表于 2016-3-11 13:01:36 | 显示全部楼层 |阅读模式
为了给自己添堵,我把一台笔记本的开发环境装成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定位中都有的概念,以"/"打头的是绝对路径,会从根目录开始找;不以"/"打头的就是相对路径,会从当前目录开始找

运维网声明 1、欢迎大家加入本站运维交流群:群②:261659950 群⑤:202807635 群⑦870801961 群⑧679858003
2、本站所有主题由该帖子作者发表,该帖子作者与运维网享有帖子相关版权
3、所有作品的著作权均归原作者享有,请您和我们一样尊重他人的著作权等合法权益。如果您对作品感到满意,请购买正版
4、禁止制作、复制、发布和传播具有反动、淫秽、色情、暴力、凶杀等内容的信息,一经发现立即删除。若您因此触犯法律,一切后果自负,我们对此不承担任何责任
5、所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其内容的准确性、可靠性、正当性、安全性、合法性等负责,亦不承担任何法律责任
6、所有作品仅供您个人学习、研究或欣赏,不得用于商业或者其他用途,否则,一切后果均由您自己承担,我们对此不承担任何法律责任
7、如涉及侵犯版权等问题,请您及时通知我们,我们将立即采取措施予以解决
8、联系人Email:admin@iyunv.com 网址:www.yunweiku.com

所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其承担任何法律责任,如涉及侵犯版权等问题,请您及时通知我们,我们将立即处理,联系人Email:kefu@iyunv.com,QQ:1061981298 本贴地址:https://www.yunweiku.com/thread-189437-1-1.html 上篇帖子: 图解Linux下如何搭建C#开发环境 下篇帖子: Linux C++开发工程师 ---从大纲看学习规划
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

扫码加入运维网微信交流群X

扫码加入运维网微信交流群

扫描二维码加入运维网微信交流群,最新一手资源尽在官方微信交流群!快快加入我们吧...

扫描微信二维码查看详情

客服E-mail:kefu@iyunv.com 客服QQ:1061981298


QQ群⑦:运维网交流群⑦ QQ群⑧:运维网交流群⑧ k8s群:运维网kubernetes交流群


提醒:禁止发布任何违反国家法律、法规的言论与图片等内容;本站内容均来自个人观点与网络等信息,非本站认同之观点.


本站大部分资源是网友从网上搜集分享而来,其版权均归原作者及其网站所有,我们尊重他人的合法权益,如有内容侵犯您的合法权益,请及时与我们联系进行核实删除!



合作伙伴: 青云cloud

快速回复 返回顶部 返回列表