1.使用File类
我们可以使用 File file = new File(xxx)
读取文件。
File类有以下几个常见的构造函数:
1 | //通过绝对路径或相对路径创建一个新 File 实例 |
但是File类无法读取jar等压缩包中的资源。
2.使用IO类
在 Java 内部当中,我们一般把文件路径称为 classpath,所以读取内部的文件就是从 classpath 内读取,classpath 指定的文件不能解析成 File 对象,但是可以解析成 InputStream,我们借助 Java IO 就可以读取出来了。
classpath 类似虚拟目录,它的根目录是从/
开始代表的是src/main/java
或者src/main/resources
目录。
需要添加的依赖:
1 | <dependency> |
以下是测试代码:
1 | public class Test { |
其中有InputStream in = Test.class.getClassLoader().getResourceAsStream("data.json");
,Test.class
指的是当前的 Test.java 编译后的 Java class 文件。getClassLoader()
表示从 Java 运行的类加载器(ClassLoader)实例中查找文件,类装载器负责从Java字符文件将字符流读入内存,并构造Class类对象,再通过getResourceAsStream()
方法可以得到目标文件的输入流。
3.利用Spring读取
Spring给我们提供了更便捷的读写方式,即利用org.springframework.core.io.Resource
类封装文件,这个类的优势在于可以支持普通的 File ,也可以支持 classpath 文件,还可以调用远程文件。
首先需要用@Autowired
注解引入一个 *ResourceLoader *类:
1 |
|
然后定义一个FileServiceImpl的实现类实现FileService接口,在其中定义一个getContent()方法,可以通过路径名返回对应资源:
1 | import fm.douban.service.FileService; |
调用时:
1 | //启动IOC容器,会自动加载包com.xxx下的 Bean,只要引用了 Spring 注解的类都可以被加载(前提是在这个包下) |
如果用file的方式读取,例子如下:
1 | //调用getContent()方法,file:mywork/readme.md表示读取资源时通过file的方式读取,相对路径是mywork/readme.md,根目录就是工程目录 |
也可以抓取网页源文件:
1 | String content2 = fileService.getContent("https://arizzer.github.io/Blog.io/"); |
4.总结
在Spring当中,把本地文件,classpath文件,远程文件都封装成Resource对象来统一加载,非常方便~