1、流的定义: 数据的有序集合,能从一个地方传输到另一端的过程。
2、流的本质: 数据传输
3、流的划分:
(1)按照方向:
输入流: 从磁盘(存储介质)---------->当前程序(内存)的过程
基类: InputStream 、 Reader
输出流: 从当前程序(内存)---------->磁盘的过程(存储介质)
基类: OutputStrem 、 Writer
(2)按照操作单元
字节流 : 二进制表示的数据,一个字节8个bit
基类: InputStream 、 OutputStream
字符流 : 将数据以字符形式表示,例如‘a’ ‘b’ 1、2、3
基类: Reader 、 Writer
(3)按照角色划分:
节点流(介质流):低级流,连接程序和储存介质的流
处理流(高级流):和节点流直接相连的流,
抽象基类: 节点流(文件流) 缓冲流(节点流的一种) 转化流 (指定编码解码)
字节流 InputStream FileInputStream BufferedInputStream InputSreamReader
字节流 OutStream FileOutputSteam BufferedOutputStream OutputStreamWriter
字节流可以用与读写视频文件 图片文件、音频文件等
字符流 Reader FileReader BufferedReader
字符流 Writer FileWriter BufferedWriter
字符流只能用于读写字符数据
4、字节流、字符流的区别:
字节: 存储的是0101
字符: 存储的字符,
(1) 读写单元不同:
字节流以字节(8 bit) 为单位
字符流以字符为单位,
(2)处理对象不同
字节流可操作所有类型的文件(视频、图片、音乐…)
字符流只能操作字符类型的文件,
(3)处理效率不同
字节流效率高,
字符流效率低,因为要涉及到编码解码
(4) 可移植性
字节流高,与平台无关
字符流低,
5、字节和字符的相互转换 (乱码问题)
原因分析:
字节数组容量太小,最后几个字节包含了一个字符的部分字节。
开始的指针不在某个字符的开始字节上。
解码、译码的码表不匹配
(1)编码解码;
字符 ----->字节: 编码过程
byte[] b = "abc".getBytes() ; //返回的是一个byte类型的数组{96,97,98}
字节------>字符: 解码过程
byte[] b = {96,97,98} ;
String str = new String(b); //返回的是一个字符串 “abc”
(2)码表:
ASCII码 :一个字符的七位表示 ,对应的字节都是整数,0-xxxxxxx
ISO-8899-1 :拉丁码表,以一个字节的8为表示,可以表示整数和负数,(最高位表示符号)
GBK :中文码表,用两个字节表示,2个字节中,第一个字节最高位为1,第二个字节的最高位为0;
Unicode :国际标准码:无论什么文字,都是两个字节
UTF-8 :基于Unicode,一个字节表示存储信息,每个字节头加入了编码信息
(2)编码类:Charset