java输入流详解
java中提供了很多中输入流对象, 如FileInputStream, BufferedInputStream, InputStreamReader, BufferedReader.很多初学者会被绕的晕头转向.
其实核心用来读取数据的就是FileInputStream, 其他的都是java对FileInputStream的封装, 体现的是装饰者设计思想.
FileInputStream
FileInputStream 字节流: 是真正读取数据的对象, 在读取是只能通过一个字节一个字节的读取, 读取后也会一个字节一个字节的打印在控制台.
BufferedInputStream
FileInputStream读取一个字节就打印一个字节, 频繁操作, 资源消耗比较大, 于是有了BufferedInputStream,.
BufferedInputStream (字节缓冲流): 任然是一个一个读取字节, 但是会等缓冲区达到限额后一次性输出在控制台. 减少频繁打印的操作.
InputStream in = new BufferedInputStream(new FileInputStream("path"));
int i = -1;
while ( (i = in.read()) != -1 ) {
println(i);
}
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);
}
BufferedReader
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);
}