Java-IO流

133 阅读1分钟

一.流

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 防止反序列化和序列化不一致