【JAVA IO 流介绍】

一、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) 利用序列化实现深层复制

猜你喜欢

转载自gaojingsong.iteye.com/blog/2314915