通常我们定位文件都是通过绝对路径进行定位,比如“F:/Java/bin/test/test.java”,这样的缺点就是,一旦项目文件移动,这些路径就完全失效。
所以,下面我们来介绍一种通过相对路径来定位文件的方法。我用的IDE是eclipse,项目路径下有src和bin文件夹分别存放,java的源代码和编译文件。
如图,我的工程名是project,在F盘的study目录下,包名是com.www,源文件是Test.java
我们知道,java的源文件编译后才能运行,也就是java运行的其实是Ttest.class,而test.class在bin文件目录下,跟src目录一点关系也没有,那么如果要定位src目录下的文件,就只能使用绝对路径来定位了。
下面讨论,用相对路径来定位bin目录下的文件,我们要定位test33.xml 、test22.xml 、test11.xml。定义类名为Test,new一个实例为te。
首先用定位该类:
采用类:Test.class.getClass()
采用实例:te.getClass() ,对象调用时,可以使用this.getClass()
定位www.txt
方法一:String str11 = te.getClass().getResource("www.txt").getFile() ,打印显示:/D:/study/project/bin/com/www/www.txt
如果想得到一个File类型的文件,使用getFile()方法,将 www.txt 换成 /com/www/www.txt 可得到同样的结果,这说明getResoure()方法是以bin 目录为根目录,可以定位bin目录下的任何一个文件,只不过它是从class文件所在目录开始向上找。(我试过定位projrct里面的文件,行不通)
方法二:String str = te.getClass().getClassLoader().getResource("bin.txt").getPath(); 打印显示:/D:/study/project/bin/bin.txt
如果要定位www.txt文件,可bin.txt 换成 /com/www/www.txt 即可,同样也是以bin目录为根目录,只不过是从bin目录开始向下找。(同样bin目录以上的不行)
加了getClassLoader()方法实际上就是把起始目录从class文件目录变成了根目录。
常用方法:
getResourse( )方法返回的是一个URL类型对象,目前貌似在定位文件上只有getPath()和getFile()方法比较常用。
如果想得到一个File,File file = new File(te.getClass().getResource("www.txt").toURI()) 或
new File(te.getClass().getResource("bin.txt").getFile())
getClassLoader()方法返回的是一个ClassLoader类型对象,他也有getResourse( )方法,相当于多加了一层,后面的都一样。
getResourceAsStream()方法返回的是一个InputStream类型对象