转载:java IO流详解

来源:互联网 发布:合并会计报表软件 编辑:程序博客网 时间:2024/05/18 02:47

BufferedInputStream 和 BufferedOutputStream

一般打开(in/out)文件, 都加上缓冲流, 提高IO性能

DOS      BOS     FOS

应用程序 -- 处理流-->处理流-->输出流--> 文件(Byte)

writeInt(i)   write() write(byte[]) ff ff ff fd

byte[]

1) BufferedInputStream/BufferedOutputStream也是处理流

BufferedInputStream(new FileInputStream(节点流))

BufferedOutputStream(new FileOutputStream(节点流))

2) BufferedInput/OutputSteam:提高了性能

3) Data流/Buffered流/File流

怎么结合使用?

DataInputStream in =

new DataInputStream(

new BufferedInputStream(

new FileInputStream(file)));

DataOutputStream out =

new DataOutputStream(

new BufferedOutputStream(

new FileOutputStream(file)));

好处:既能扩展功能,又能提高性能

2 文件复制实现与优化

BufferedInputStream/BufferedOutputStream

//read(byte[] buf)/out.write(byte[] buf, 0, int size)

3 字符串的序列化(文字的编码方案)

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},


4 认识文本和文本文件

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 =

new BufferedReader(in);

or

BufferedReader in = new BufferedReader(

new FileReader(filename));

6) 写出一个文本文件:

PrintWriter out =

new PrintWtirer(new FileWriter(filename));

or

PrintWriter out =

new PrintWtirer(

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



8.Java IO 总结

1)是一种数据操作模型: 把任何数据都作为Byte的有序集合

看待逐一处理的方式方式叫做流.

Java 流模型, 是byte by byte 是数据集合

data   :  41 42 00 00 ff ff d6 d0

index  :   0  1  2  3  4  5  6  7  8

pointer:   ^

2) 文件流是流的一种

InputStream --- FileInputStream

|- ByteArrayInputStream

3) Byte流是最基本的流操作

InputStream  Byte输入流

OutputStream  Byte输出流

4) 流动最基本实现: 节点流

FileInputStream

ByteArrayInputStream

等....

5) 最基本的流操作: read() write()

原创粉丝点击