Java 读取文件

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 lines = Files.lines(path)) {
    String data = lines.collect(Collectors.joining("\n"));
    System.out.println(data);
}

注意这里的Stream lines需要关闭

4. 利用FileUtils读取文件

我们还可以使用commons-io包里面的读取文件相关类FileUtils


    commons-io
    commons-io
    2.5

利用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);

你可能感兴趣的:(java碎片收集)