黑马程序员技术交流社区

标题: IO流的总结,希望对大家有所帮助 [打印本页]

作者: vipzh    时间: 2012-12-10 16:42
标题: IO流的总结,希望对大家有所帮助
1. 输入 InputStream,输出 OutputStream
以字节为单位存取相对于内存/管道来说
OutputStream(write)

内存 ----------------------------------> 硬盘文件 管道

内存 <---------------------------------- 硬盘文件

InputStream(read)




2. FileOutputStream f = new FileOutputStream("tarena.txt");

//如果之前有这文件,将会覆盖

FileOutputStream f = new FileOutputStream("tengbx.txt",true);

//如果有这文件,只会追加

3. 处理字节流的两个基础类是:

InputStream                          OutputStrean

处理字符流的两个基础类是:Reader            Writer




1. InputStreamOutputStream(抽象类,以字节为单 位进行读写)

1) InputStream 介绍:


->InputStream in = new FileInputStream("file.txt");

byte[] buf = new byte[in.available()];

int count = in.read(buf);

in.close();

intread()读取一个字节,并返回读取的字节数

intread(byte[]buffer)将数据读入一个字节数组,同时 返回读取的字节数

intread(byte[]buffer,intoffset,intlength)将数据 读入一个字符数组,放到数组的 offset 指定的位置开始, 并用 length 指定读取的最大字节数
voidclose():用完流以后一定要关闭

intavailable():用于返回在不发生阻塞的情况下,该流可以读取的字节数

2) OutputStream 介绍:

write(intc):写入一个字节到流中

write(byte[]buffer):将字节数组中的数据写入到流中intwrite(byte[]buffer,intoffset,intlength)将字节 数组中从 offset 开始的 length 个字节写入流中。
voidclose():关闭输出流

voidflush():将缓冲区的字节立即发送到流中,同时清空缓冲区





2.FileInputStreamFileOutputStream

*注:1)生成 FileInputStream 和 FileOutputStream 对 象 时 , 如 果 找 不 到 指 定 文 件 , 将 会 产 生FileNotFoundException 异常,必须捕获并声明抛出
2)当读的时候(InputStream/Reader)时,文件必
须存在,否则报错

3)当写的时候(OutputStream/Writer)时,文件可以 直接新建




3. FilterInputStream 和 FilterOutputStream

(抽象类,高级字节流)

BufferedInputStream 和 BufferedOutputStream

(带缓冲的过滤流,每次缓冲 8k) DataInputStream 和 DataOutputStream
(读写基本数据类型和 String 对象)




->DataInputStream dis = new DataInputStream(new BufferredInputStream(new FileInputStream(“file.txt”)))



*注:(一般将低级 InputStream 类写在最里层,如


ByteArrayInputStream,FileInputStream,而将高级

InputStream  类写在外层,如 DataInputStream ,、

BufferedInputStream)




4. ReaderWrite(以字符为单位进行读写)

方法与 InputStream/OutputStream 类似,这里仅举

Reader 例子

低级 Reader 类: CharArrayReader/StringReader/FileReader 等 高级 Reader 类: BufferReader/InputStreamReader 等




eg: ->BufferedReader bf = new BufferedReader(new InputStreamReader(new FileInputStream(file)),”GBK”);
InputStreamReader:字节流与字符流之间的桥梁,读
出字节并且将其按照指定的编码方式转换成字符。

bf.readLine();

--------------------------------------------------- 注意: 没有 PrintReader,只有 PrintWriter,PrintWriter 有 Println()方法。 例如:
PrintWriter prw=new PrintWriter(new File(“tengbx.txt”));


prw.print("张三,您好!");

prw.println();//换行




虽然 BufferWriter 给输出字符加缓冲,但是它的方法很少;因此使用 PrintWriter,它可以使用字节流对象构 造,省了桥转换这一步, 而且方法很多。

PrintWriter 是带缓冲的。最常用的输出流。




5. 字节流的字符编码: 字符编码把字符转换成数字存储到计算机中,按ASCii
将字母映射为整数。把数字从计算机转换成相应的字

符的过程称为解码。 乱码的根源是编码方式不统一。任何一种编码方式中都会向上兼容ASCII码。所以英 文没有乱码。
编码方式的分类:

ASCII(数字、英文):1 个字符占一个字节(所有的编码集都 兼容ASCII)
ISO8859-1(欧洲,拉丁语派):1 个字符占一个字节

GB-2312/GBK:1 个字符占两个字节。GB 代表国家标准。GBK 是在 GB-2312 上增加的一类新的编码方式,也是现在最常用的汉字编码方式。

Unicode: 1 个字符占两个字节(网络传输速度慢)


UTF-8:变长字节,对于英文一个字节,对于汉字两个或
三个字节。

6. RandomAccessFile(读写随即访问文件)

使用 FileWriter 向一个字符文件中写入数据时,新写入内容覆盖源文件内容。而用 RandomAccessFile 类可以避 免,可以在文件任何位置查找或者插入数据




7. wirter/reader 和 inputstream/outputstream 区别 从质上讲,wirter/reader 和 inputstream/outputstream 的最大区别在于 encode(编 码)和decode(解码). inputstream/outputstream 直 接对 byte[]进行操作,不会更改任何信息,原原本本的反应数据内容。

writer/reader 在操作时会进行 decode/encode。它会根 据你的系统属性

file.encoding 来 decode 数据。比如你从文件中读取一行,用 reader.readLine()返回的 string 是经过 decode 的数 据。如果你的文件的 encoding 不等于你的 file.encoding 的值,就会产生编码错误



作者: 黄晶    时间: 2012-12-10 22:36
Soga.....楼主总结的好啊!!!{:soso_e179:}




欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/) 黑马程序员IT技术论坛 X3.2