java输入流详解

java输入流详解

java中提供了很多中输入流对象, 如FileInputStream, BufferedInputStream, InputStreamReader, BufferedReader.很多初学者会被绕的晕头转向.

其实核心用来读取数据的就是FileInputStream, 其他的都是java对FileInputStream的封装, 体现的是装饰者设计思想.

FileInputStream

FileInputStream 字节流: 是真正读取数据的对象, 在读取是只能通过一个字节一个字节的读取, 读取后也会一个字节一个字节的打印在控制台.

image-20210311122852306

BufferedInputStream

FileInputStream读取一个字节就打印一个字节, 频繁操作, 资源消耗比较大, 于是有了BufferedInputStream,.

BufferedInputStream (字节缓冲流): 任然是一个一个读取字节, 但是会等缓冲区达到限额后一次性输出在控制台. 减少频繁打印的操作.

InputStream in = new BufferedInputStream(new FileInputStream("path"));
int i = -1;
while ( (i = in.read()) != -1 ) {
    println(i);
}

image-20210311124231623

InputStreamReader

无论是InputStream还是BufferedInputStream都是以字节为读取单位的, 很多时候我们读取的内容需要以字符呈现, 以便我们读懂. 所以有InputStreamReader

InputStreamReader (字符流): 一个一个字节的读取字节, 等到凑够一个字符后, 在进行打印输出.

因为不同编码的一个字符对应不同个数的字节, 所以需要指定好编码规则

InputStream in = new InputStreamReader(new FileInputStream("path"), "UTF-8")
String s = null
while ( (s = in.readLine()) != null ) {
    System.out.println(i);
}

image-20210311125121743

BufferedReaders

InputStreamReader已字符形式打印出来, 但是也是一个字符一个字符打印, 当我们需要以行读取打印是, 需要继续做一层包装

BufferedReader(字符缓冲流): 一个字节一个字节的读取, 但是会经过字符流转为字符, 并且在缓冲区中进行缓存, 等满足一定限额后,一行一行的进行打印.

Reader in = new BufferedReader(
    new InputStreamReader(
         new FileInputStream("path"),
         "UTF-8"
    )
);
String s = null;
while ( (s = in.readLine()) != null ) {
    System.out.println(i);
}

image-20210311125949936

衣带渐宽终不悔,为伊消得人憔悴!
原文地址:https://www.cnblogs.com/ryxiong-blog/p/14517240.html