一、JAVAIO关系图
二、IO流的分类
根据处理数据类型的不同分为:字符流和字节流
根据数据流向不同分为:输入流和输出流
三、字符流和字节流
字符流的由来: 因为数据编码的不同,而有了对字符进行高效操作的流对象。本质其实就是基于字节流读取时,去查了指定的码表。字节流和字符流的区别:
(1)读写单位不同:字节流以字节(8bit)为单位,字符流以字符为单位,根据码表映射字符,一次可能读多个字节。
(2)处理对象不同:字节流能处理所有类型的数据(如图片、avi等),而字符流只能处理字符类型的数据。
(3)字节流在操作的时候本身是不会用到缓冲区的,是文件本身的直接操作的;而字符流在操作的时候下后是会用到缓冲区的,是通过缓冲区来操作文件,我们将在下面验证这一点。
结论:优先选用字节流。首先因为硬盘上的所有文件都是以字节的形式进行传输或者保存的,包括图片等内容。但是字符只是在内存中才会形成的,所以在开发中,字节流使用广泛。
四、输入流和输出流
对输入流只能进行读操作,对输出流只能进行写操作,程序中需要根据待传输数据的不同特性而使用不同的流。
五、实际应用
1、文件复制实现与优化
BufferedInputStream/BufferedOutputStream
//read(byte[] buf)/out.write(byte[] buf, 0, int size)
2、字符串的序列化(文字的编码方案)
1) Stirng 字符串本质上是char[] 将char[] 转换成byte序列就是字符串的编码, 就是字符串的序列化问题,char是16位无符号整数, 值是unicode编码
2) utf-16be 编码方案, 将16位char从中间切开为2个byte, utf-16be是将unicode char[] 序列化为byte[]的编码
方案 能够支持65535 个字符编码, 英文浪费空间
char[] = ['A','B','中']
byte[] = [00, 41, 00, 42, 4e, 2d]
3) UTF-8 编码方案 采用变长编码 1~N方案, 其中英文1个byte中文3个byte
4) GBK 中国国标,支持20000+ 中日韩英, 英文1位编码,中文2位与unicode不兼容, 需要码表转换(散列表查询)
char[] = ['A','B','中'] //4e2d
GBK(GB2312): {41,42,d6,d0},
3、认识文本和文本文件
1) java的文本(char)是16位无符号整数, 是字符的unicode编码
2) 文件是byte by byte 的数据序列
3) 文本文件是 文本char 序列按照某种(utf-8,utf-16be, gbk)方案序列化为byte的存储结果.
5 字符流(Reader Writer)
1) 字符的处理, 一次处理一个字符(unicode)
2) 字符的底层仍然是基本的字节流
3) 字符流的基本实现:
InputStreamReader:完成byte流解析为char流, 按照
编码解析
OutputStreamWriter:提供char流到byte流, 按照
编码处理
4) 字符流的处理流
是字符读写的功能扩展, 极大的方便了文本的读写操作
BufferedReader : readLine()//一行一行的读取,
如果读取到文件的结尾,返回值是null
PrintWriter: println(内容)//每一行内容就换行
5)读取一个文本文件:
InputStream is =new FileInputStream("gbk.txt");
Reader in =new InputStreamReader(is);
BufferedReader reader =ew BufferedReader(in);
or
BufferedReader in = new BufferedReader(ew FileReader(filename));
6) 写出一个文本文件:
PrintWriter out =new PrintWtirer(new FileWriter(filename));
or
PrintWriter out =new PrintWtirer(ew OutputStreamWriter(new FileOutputStream(filename)));
7) 系统的默认编码 中文一般是GBK
String encoding=System.getProperty("file.encoding");
6 对象的序列化: 将Object转换为byte序列,就是序列化,
反之叫反序列化
1) 序列化流, 是过滤流
ObjectOutputStream writeObject(Object)
序列化对象
ObjectInputStream readObject()
对象的反序列化
2) 序列化接口: 对象必须实现"序列化接口"才能进行
"序列化"否则出现不能序列化的异常!
3) JavaBean 规范, 必须实现Serializable接口
Java API中的类大多是Java Bean, 基本都实现了
Serializable
7 浅层复制与深层复制
1) Java的默认复制规则是浅层复制, 性能好, 隔离性差,浅层复制现象, 只复制第一层对象
2) 利用序列化实现深层复制