说道用JAVA获取文件,对于很多像我这样的人来说,肯定会第一个想到用JAVA的File类,如要取得D:/1.txt文件,就会这样用:
File file = new File("c:/test.txt");
这样用有什么问题,相信大家都知道,就是路径硬编码,如果换到其他的运行环境下,这样写肯定是失败的,对于JAVA来说,代码应该做到一次编译,到处可用,所以,我们应该尽量避免使用硬编码,更多的直接使用绝对路径。
除了Flie类,我们有什么方法可以更好地获得文件呢?当然有,那就是Class.getResource()与Class.getResourceAsStream()方法,但很多人还是不太懂它的用法,因为很多人都不知道应该传怎么样的参数给它在此仅给不会或者还不是很熟的人解释一点点。
首先我们看下JDK_API文档,
文档的描述有点拗口,大致的意思就是通过传入的文件名去加载对应文件,难点就在于”/”这个斜杠加与不加的区别,现在我就以更加明了的方式讲解我对它的理解。
比如我们有以下目录
在上面的目录中,有一个src目录,那么,我们在Test类中应该如何分别获得
file1.txt file2.txt 这两个文件呢?
其中file1.txt可以通过这两种方式来获取:
方法一:
File file1 = new File(Test.class.getResource("file1.txt").getFile());
方法二:
File file1 = new File(Test.class.getResource("/com/file1.txt").getFile());
file2.txt获取方法:
File file4 = new File(Test.class.getResource("/file2.txt").getFile());
看到这里大家应该明白,获取不同路径下文件该传入什么参数了吧。当传入的参数是没有”/”的时候,获取的是当前类所在包下的对应文件。而当参数带有”/”,则是从ClassPath根目录下获取文件。该方法的本质其实只是通过传入path构造一个绝对路径,最终还是由ClassLoader获取资源。
还有一个getResourceAsStream()方法,参数是与getResouce()方法是一样的,它相当于你用getResource()取得File文件后,再new InputStream(file)获取到输入流。
这两个方法最常用到的地方就是读取被配置文件,如数据库配置文件,日志配置文件等。