Java IO类继承关系如下图:
本帖隐藏的内容
一、InputStream与OutputStream是所有输入输出字节流的基类,Reader与Writer是所有输入输出字符流的基类。
二、节点流(介质流)
父类 | InputStream | OutputStream | Reader | Writer |
文件 | FileInputStream | FileOutputStream | FileReader | FileWriter |
数组 | ByteArrayInputStream | ByteArrayOutputStream | CharArrayReader | CharArrayWriter |
字符串 | StringReader | StringWriter | ||
管道 | PipedInputStream | PipedOutputStream | PipedReader | PipedWriter |
三、处理流(装饰流)
父类 | InputStream | OutputStream | Reader | Writer |
转换流 | InputStreamReader | OutputStreamWriter | ||
缓冲流 | BufferedInputStream | BufferedOutputStream | BufferedReader | BufferedWriter |
数据流 | DataInputStream | DataOutputStream | ||
对象流 | ObjectInputStream | ObjectOutputStream | ||
打印流 | PrintStream | PrintWriter |
三、计算机储存数据的最终形式是二进制编码,八位为一字节。字节流是按字节读取,自然不牵涉到编码的问题。字符流按字符读取,而字符根据不同的编码集所占用的字节数与字符编码也不同。这也就关系到了编码的问题。
1、两个转换流InputStreamReader与OutputStreamWriter,将字节流转换为字符流,是字节流通向字符流的桥梁,使用指定的字符集读取字节并将其解码为字符。所以在它们的构造器参数当中是需要指定字符集的,如果没有指定,则以默认的系统字符集为准。
2、FileReader与FileWriter是与文件操作相关的两个字符节点流。文件一般以某种特定字符编码进行保存,现在要将它转换为字符流,那是肯定要指定字符编码集的。但是在它们的构造函数当中并没有要指定字符编码集的参数。官方的解析是此类的构造方法假定默认字符编码和默认字节缓冲区大小是适当的。要自己指定这些值,可以先在 FileInputStream 上构造一个 InputStreamReader。
3、数组节点流:CharArrayReader与CharArrayWriter,字符串节点流:StringReader和StringWriter。它们直接在内存中对字符数组与字符串进行的操作。在内存中默认的字符编码都为Unicode编码请查看Java内部编码过程也就不存在编码转换的问题。
4、缓冲流:BufferedReader与BufferedWriter,它们是对字符流进行的第二次包装,所以也不存在编码的问题。