从数据传输方式或者说是运输方式角度看,可以将 IO 类分为:
字节
是个计算机看的,字符
才是给人看的
(整体结构如下,部分派生类有缺失)
(整体结构如下,部分派生类有缺失)
简而言之,字节是给计算机看的,字符才是给人看的。
编码就是把字符转换为字节,而解码是把字节重新组合成字符。
如果编码和解码过程使用不同的编码方式那么就出现了乱码。
UTF-16be 中的 be 指的是 Big Endian,也就是大端。相应地也有 UTF-16le,le 指的是 Little Endian,也就是小端。
Java 使用双字节编码 UTF-16be,这不是指 Java 只支持这一种编码方式,而是说 char 这种类型使用 UTF-16be 进行编码。char 类型占 16 位,也就是两个字节,Java 使用这种双字节编码是为了让一个中文或者一个英文都能使用一个 char 来存储。
从数据来源或者说是操作对象角度看,IO 类可以分为:
FileInputStream、FileOutputStream、FileReader、FileWriter
PipedInputStream、PipedOutputStream、PipedReader、PipedWriter
DataInputStream、DataOutputStream
BufferedInputStream、BufferedOutputStream、BufferedReader、BufferedWriter
PrintStream、PrintWriter
ObjectInputStream、ObjectOutputStream
InputStreamReader、OutputStreamWriter