一.流
input 输入(硬盘数据读取到内存)
output 输出 (内存数据写入到硬盘)
字节输入输出流 InputStream OutputStream
字符输入输出流 Reader Writer
1.字节流实现类:文件输入/输出字节流
FileInputStream
read() 读取到文件末尾返回-1
FileOutputStream
write(byte b[], int off, int len)
2.字符流
中文:
GBK编码 ->两个字节一个汉字/ UTF-8 ->三个字节一个汉字
如果用字节流读取中文,可能会导致乱码。
FileReader 按照字节读取
FileWriter: 可以写字符,也可以直接写字符串 write写入数据到内存缓存区(将字符转化为字节) flush方法将内存缓冲区数据刷新到文件中 /流对象还可以继续使用 close 会先把内存缓冲区刷新到文件中 /流对象无法使用
(内部也是通过字节流实现)
3.缓冲流
基本原理:是在创建流对象时,会创建一个内置的默认大小的缓冲区数组,通过缓冲区读写,减少系统IO次数,从而提高读写的效率
BufferedInputStream/BufferedOutputStream
BufferedReader/BufferedWriter
FileOutputStream fos = new FileOutputStream("c.txt");
BufferedOutputStream bos = new BufferedOutputStream(fos);
bos.write("输入数据写入缓存区".getBytes());
bos.close();
}
4.转化流
字节流转化为字符流
InputStreamReader isr = new InputStreamReader(new FileInputStream("bb.txt"),"gbk");
OutputStreamWriter osw = new OutputStreamWriter(new FileOutputStream("aa.txt"),"utf-8");
5.序列化
5.1序列化流ObjectOutputStream
ObjectOutputStream oos = new ObjectOutputStream(new FileOutputStream("ac.txt"));
oos.writeObject(new Person01("AAA",1));
oos.close();
ObjectInputStream ois = new ObjectInputStream(new FileInputStream("ac.txt"));
Person01 obj = (Person01) ois.readObject();
System.out.println(obj.getAge() + obj.getName());
ois.close();
5.2 transient:将实现序列化的类属性中添加该关键字,序列化对象的时候,这个属性就不会序列化到指定的目的地中
声明serialVersionUID 防止反序列化和序列化不一致