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. InputStream和 OutputStream(抽象类,以字节为单 位进行读写)
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.FileInputStream和 FileOutputStream
*注: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. Reader和 Write(以字符为单位进行读写)
方法与 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 的值,就会产生编码错误 |