今天处理想加载maven项目中resources的配置文件(a/b.txt) 失败,浪费了时间,干脆好好的攻克一下这个问题.
设计url的对象有File对象(FIS,FOS等同),Class,ClassLoader,URL.
一.
建立新项目,分别在项目所在盘符根目录,即将打包的盘的项目根目录,即将打包的jar文件旁边,项目根目录,.java文件旁边准备123.txt文本,里面的内容注明文件位置.之后直接在File对象中测试url= 123.txt (./123.txt) || /123.txt ,之后export到预定位置,在cmd中运行.
结果是:
a.无论是java project还是maven project ./123.txt或123.txt指向的位置都是工程的根目录.
b.如果项目编译打包,那么./123.txt和123.txt指向的是和jar文件旁边.
c.无论是eclipse环境还是编译打包生成的jar/war, /123.txt都指向文件所在盘符的根目录,linux系统应该直接是/路径.
d.maven项目会因为maven的原因,源代码(eclipse 工程目录)和jar包/war包的文件目录不一致,先明白./123.txt和123.txt回和src文件夹平行.取resource里面的文件请继续看下面.
二.
1.取resource里面的文件推荐getResourceAsStream(String name)方法.
2.该方法Class对象和ClassLoader对象都有,但结果很可能不一致.
3.填入参数我没有填"/",试了一次直接空指针.
4.getResource和getResourceAsStream方法的区别是一个前者返回Url对象(该对象稍作处理就可取得流的绝对路径),后者直接返回流.
5.Test.class().getResource()和Test.class().getClassLoader().getResource()的区别是前者返回的.class文件所在的目录,后者是项目的根目录(即使打包成jar/war也依然是).标准maven项目中src/java/resources/里面的文件就可以利用类加载器取得
三.
若还要继续话题,那么就可以去看ClassLoader的getResource()的处理方式,这里涉及java的3种类加载器知识.maven这种帮助java程序员快速构建,编译,打包的工具的知识.感兴趣的朋友可以指出不足甚至帮忙继续话题.以后有合适的时间我也会继续.
博客写得,很丑,很菜.sorry.