缓冲流
BufferedOutputStream
继承于outputstream
构造:
new BufferedOutputStream(outputstream);
new BufferedOutputStream(out,size);
使用:
bos = new BufferedOutputStream(new FileOutputStream("a.txt"));
bos.write();
BufferedInputStream
继承于InputStream
构造
new BufferedInputStream(inputstream);
new BufferedInputStream(inputstream,size);
使用
bis =new BufferedInputStream(new FileInputstram("a.txt"));
while((len=bis.read())!=-1){
xxxlen
}
完全类似于文件字节/符输入输出流
测试了一下,复制一张图片。使用文件字节输入输出流,使用byte数组的形式,花费234毫秒。使用字节缓冲输入输出流,不适用byte的写入读出形式,花费46毫秒。使用byte的读入写出形式,花费4毫秒
BufferedWriter
继承于Writer
newLine():添加换行
BufferedReader
字符输入缓冲流,继承于reader
string readLine():读一行,若一行为空则为返回null
转换流
编码问题
ASCII码:0–48;a–97;A–65
GBK:在GB2312基础上的扩展
UTF-8:中文3个字节表示
FileReader默认读取utf-8格式。这样读入GBK的中文文本就出现乱码。底层是调用inputstream来读取文件。实际上的作用就是使用默认码表将字节转换为字符。
InputStreamReader
继承于Reader。将字节转换为字符,但可以通过指定编码表进行解码
OutputStreamWriter
构造
new OutPutStreamWriter(out);
new OutputStreamWriter(out,charset)
序列化流
序列化:将对象写入到文件
反序列化:将文件中的对象读取到内存
ObjectOutputStream
new ObjectOutputStream(outs);
- s创建oos对象
- 构造中填入outputstream对象
- oos.writeObject(填入的对象)。这个s对象的类需要实现Serializable接口。否则会报未序列化异常
ObjectInputStream
new ObjectInputStream(ins);
需要:
- 类需要实现Serializable接口
- 存在类对应的class文件
瞬态关键字
static关键字l修饰的成员变量不可以序列化。因为序列化的都是对象
transient关键字修饰的成员变量不可以被序列化
InvalidClassException
修改类后不进行序列化直接反序列化后,出现此异常
在将存入的对象的java文件编译为class文件时,由于这个类实现了Serializable接口。这个class文件会得到一个序列号。保存这个对象的文件中也会有这个序列号。在反序列号时,使用class文件的序列号与保存文件中的序列号相比较,一致则反序列化成功。而更改类不进行序列化时,由于编译的java文件序列号是新的。而保存文件中序列号是之前的,对不上,就会报上边的异常。
解决:使一个类序列号不会改变。
在要序列化的类中,定义一个long序列号
private static final long serialVersionUID = 1L;
打印流
PrintStream,继承于OutputStream
new PrintStream(out);
new PrintStream(file);
new PrintStream(str);
只能数据输出不可以读取数据
不会抛出io异常
write():会使用编码表来输出数据。如97—>a
print():是什么打印什么。如97—>97
println()
输出目的地:
sout:输出在控制台
system.setout(new PrintStream(“目的地”)):输出在目的地文件