InputStream(字节输入流) OutputStream(字节输出流) Reader(字符输入流) Writer(字符输出流)都是抽象类,所以不可以直接new;它们是各大输入输出流的父类。
输入流:是要从数据源(键盘,文件,磁盘等)传到(这里我们叫做read)计算机内存、程序的一种流(为什么传到内存?因为要进行数据处理啊!数据处理当然要将数据传到计算机内存进行处理),Java奉行一切皆为对象,所以这里的流是一种类,new这个类之后,就创建了一个流对象,就可以调用里面的各种方法了;这个类里面有很多方法,比如将这个流里面的数据用read方法读出来,读到byte或者char数组中(这里的byte和char数组也是类,new之后,它们就在内存中分配了一定的空间)方便进行数据处理。
输出流:从计算机程序中的数据转化为OutputStream(输出流),我们一般称之为输出流。
下面上图,易于记忆:
字节流:以字节输入流为例,字节输入流就是以一个字节为单位将数据源中的数据读入流中。
字符流:以字符输入流为例,字符流可以看作是包装流,其底层还是采用字节输入流来读取字节,然后它使用制定的编码方式将读取字节解码为字符。
注意点:
FileReader继承自InputStreamReader ;
它们的区别:
InputStreamReader 是字节流通向字符流的桥梁:它使用指定的 charset 读取字节并将其解码为字符。它使用的字符集可以由名称指定或显式给定,或者可以接受平台默认的字符集。
每次调用 InputStreamReader 中的一个 read() 方法都会导致从底层输入流读取一个或多个字节。要启用从字节到字符的有效转换,可以提前从底层流读取更多的字节,使其超过满足当前读取操作所需的字节。
为了达到最高效率,可要考虑在 BufferedReader 内包装 InputStreamReader。例如:
BufferedReader in
=newBufferedReader(new InputStreamReader(System.in));
FileReader是用来读取字符文件的便捷类。此类的构造方法假定默认字符编码和默认字节缓冲区大小都是适当的。要自己指定这些值,可以先在 FileInputStream 上构造一个 InputStreamReader。
FileReader用于读取字符流。要读取原始字节流,请考虑使用 FileInputStream
总结:InputStreamReader 是用来读取原始字节流,可指定编码格式,而FileReader是读取字符流,使用系统默认的编码格式,当读取中文文件是易出现乱码问题。
推荐使用:
File file = new File (filename);
InputStreamReader input =new InputStreamReader(new FileInputStream(file),"UTF-8");
BufferedReader br = new BufferedReader(input);
InputStreamWriter与FileWriter异同点与之类似;
从字节流到字符流的转换:
System.in的类型可以归结为节点流、字节流、输入流;
InputStreamReader这个对象是处理流,字符流,输入流;
BufferedReader的类型是缓冲处理流、字符流、输入流。
类 InputStreamReader是字节流通向字符流的桥梁:它使用指定的 charset 读取字节并将其解码为字符。它使用的字符集可以由名称指定或显式给定,或者可以接受平台默认的字符集。如:GBK
每次调用 InputStreamReader 中的一个 read() 方法都会导致从底层输入流读取一个或多个字节。要启用从字节到字符的有效转换,可以提前从底层流读取更多的字节,使其超过满足当前读取操作所需的字节。 为了达到最高效率,可要考虑在 BufferedReader 内包装 InputStreamReader。例如: BufferedReader in= new BufferedReader(new InputStreamReader(System.in));
System.in是个字节流
InputStreamReader是个字符流和字节流之间的转换中介
BufferedReader是个字符流
整体意思就是用InputStreamReader这个中介把System.in这个字节流转换成字符流BufferedReader
这样输入的时候就可以不是一个一个字节读,而是一个一个字符读,再加上是个Buffer,效率会高很多。
InputStream is = System.in;//键盘输入流
InputStreamReader isr = new InputStreamReader(is);//字节流转换为字符流
BufferedReader bufr = new BufferedReader(isr);//把字符流添加到缓冲流
用户通过reader对象的readLine方法来进行读取。
来源:https://www.cnblogs.com/zjf1995/p/9941631.html