JAVA有多种读取文件的方式,其中比较深层次的原理在我的另外一篇文章分析过:JDK核心JAVA源码解析(5) - JAVA File MMAP原理解析,那么,我们有哪些方式去读取一个文件的内容呢?
1. 从ClassPath中读取文件
直接从项目的classpath(maven的话src/main/resource编译之后也会存在于classpath下)读取:
InputStream inputStream = getClass().getClassLoader().getResourceAsStream("test.txt");
StringBuilder resultStringBuilder = new StringBuilder();
try (BufferedReader br
= new BufferedReader(new InputStreamReader(inputStream))) {
String line;
while ((line = br.readLine()) != null) {
resultStringBuilder.append(line).append("\n");
}
}
System.out.println(resultStringBuilder.toString());
注意一定要关闭BufferedReader
等资源,这里用了JDK7try with resource
的特性
2. JDK7中的读取文件内容的方式
利用Path
对象省略了各种StreamReader
,同时原生自带读取所有内容到内存的方法,在读取比较小的文件所有内容时我们可以考虑这么做:
Path path = Paths.get(getClass().getClassLoader()
.getResource("test.txt").toURI());
byte[] fileBytes = Files.readAllBytes(path);
String data = new String(fileBytes);
System.out.println(data);
3. JDK8中的读取文件内容的方式
JDK8继续优化了这块的代码,引入了Stream
相关框架,同时针对文件读取也能转化为Stream操作:
Path path = Paths.get(getClass().getClassLoader()
.getResource("test.txt").toURI());
try (Stream<String> lines = Files.lines(path)) {
String data = lines.collect(Collectors.joining("\n"));
System.out.println(data);
}
注意这里的Stream<String> lines
需要关闭
4. 利用FileUtils读取文件
我们还可以使用commons-io
包里面的读取文件相关类FileUtils
:
<dependency>
<groupId>commons-io</groupId>
<artifactId>commons-io</artifactId>
<version>2.5</version>
</dependency>
利用FileUtils
我们连自愿关闭也可以不用关心:
ClassLoader classLoader = getClass().getClassLoader();
File file = new File(classLoader.getResource("test.txt").getFile());
String data = FileUtils.readFileToString(file, "UTF-8");
System.out.println(data);
5. 利用IOUtils读取文件,URL等等
我们还可以通过IOUtils
读取各种输入流InputStream
InputStream fis = getClass().getClassLoader().getResourceAsStream("test.txt");
String data = IOUtils.toString(fis, "UTF-8");
System.out.println(data);
读取URL:
URL urlObject = new URL("http://www.baidu.com");
URLConnection urlConnection = urlObject.openConnection();
InputStream inputStream = urlConnection.getInputStream();
String data = IOUtils.toString(inputStream, "UTF-8");
System.out.println(data);
读取Jar包中的文件(例如common-io的/META-INF/LICENSE.txt)
Class clazz = IOUtils.class;
//这里开头的/代表jar包根目录
InputStream inputStream = clazz.getResourceAsStream("/META-INF/LICENSE.txt");
String data = IOUtils.toString(inputStream, "UTF-8");
System.out.println(data);