前几天改了一个小bug,java文件导出jar包后相对路径失效的问题,用java获取文件,听似简单,但对于像我这种java基础较为薄弱的人来说,还是掌握颇浅。下面来介绍一下Class中getResource()方法的简单使用。
用java获取文件,相信大家最经常使用的,就是java的File类,如果想取得C:/XX.txt
文件,就会这样 File file = new File("C:/XX.txt");
不过这样有什么问题呢,相信大家也都知道,会造成路径硬编码。不过在现实应用来说,java最终生成的应用都会部署到Windows外的操作系统中,对于某些系统来说,如果使用这样的硬编码,会直接造成失败,所以,我们应该尽量避免硬编码,即避免使用绝对路径。
在Class
类中为我们提供了getResource()
与getResourceAsStream
方法,但是包括我在内的很多人都不懂它的用法,在此给没用过此类的人解释一点点。
比如我们有一下目录
|--project |--src |--Test.java |--file1.txt |--file2.txt |--bin |--Test.class |--file3.txt |--file4.txt
在上面的目录中,有src目录,这是一个java源文件目录,有一个bin目录,存放的是java编译后的(.class)二进制文件的存放目录,那么我们该如何来获取file1.txt ,file2.txt ,file3.txt ,file4.txt
四个文件呢?
首先讲file3.txt ,file4.txt
file3.txt
方法一:
new File(Test.class.getResource("file3.txt").getFile());
方法二:
new File(Test.class.getResource("/javaapplication/file3.txt").getFile());
方法三:
File(Test.class.getClassLoader().getResource("javaapplication/file3.txt").getFile());
file4.txt:
方法一:
new File(Test.class.getResource("/file4.txt").getFile());
方法二:
new File(Test.class.getClassLoader().getResource("file4.txt").getFile());
然而file1.txt ,file2.txt
不能使用class.getResource()
这种方法获得,它们的获取方法只能使用它们的绝对路径c:/project/src/file2.txt
总结一下,就是你想获取文件,应该以最终生成的
class
文件为着手点,不要以.java
文件路径为着手点,因为java是编译型语言。getResource()
方法可以定位准确定位class
文件所在的根目录。