IO流(三)

2023-12-14 23:11:58

目录

一.缓冲流

1.字节缓冲流

2.字符缓冲流

二.转换流

三.序列化流和反序列化流


一.缓冲流

基本知识

缓冲流是高级流,是对基本流进行了包装

缓冲流的底层自带了长度为8192的缓冲区来提高性能

底层真正起到作用的还是基本流

1.字节缓冲流

代码书写大同小异

构造参数里面去关联基本流
?

  //创建缓冲流的对象
        BufferedInputStream bis=new BufferedInputStream(new FileInputStream("a.txt"));
        BufferedOutputStream bos=new BufferedOutputStream(new FileOutputStream("copy.txt"));
        //循环读取并写道目的地
        int b;
        while((b=bis.read())!=-1){
            bos.write(b);
        }
        //释放资源
        bos.close();
        bis.close();

这里面只需要关闭缓冲流,就不需要关闭基本流了,因为在缓冲流的底层代码中,自动关闭基本流

利用数组一次读取多个字节

BufferedInputStream bis=new BufferedInputStream(new FileInputStream("a.txt"));
        BufferedOutputStream bos=new BufferedOutputStream(new FileOutputStream("b.txt"));
        //利用数组一次读取多个字节
        //最好是1024的整数倍
        byte []bytes=new byte[1024];
        int len;
        while((len=bis.read(bytes))!=-1){
            bos.write(bytes,0,len);
        }
        //释放资源
        bos.close();
        bis.close();

对于缓冲流提高效率的原理

字节缓冲输入流和字节缓冲输出流都有缓冲区

缓冲流提速的根本原因就是提高了内存与硬盘之间的数据传输速度

内存之间的缓冲流传递非常快

2.字符缓冲流

字符缓冲流特有的方法

   //创建对象
        BufferedReader br=new BufferedReader(new FileReader("a.txt"));
        //读取一整行 遇到回车换行就会结束 但是不会读取回车换行
        String s = br.readLine();

        System.out.println(s);
        //关流
  //创建对象
        BufferedReader br=new BufferedReader(new FileReader("a.txt"));
        //循环读取
        String s;
        while((s=br.readLine())!=null){
            //readLine如果读取完毕,则返回值是null
            System.out.println(s);
        }
        //关流
        br.close();

?总结

二.转换流

转换流是关联字符流和字节流之间的桥梁

1.指定字符集读取


        //指定字符集读取数据
        FileReader fr=new FileReader("a.txt", Charset.forName("GBK"));
        //读取数据
        int ch;
        while((ch=fr.read())!=-1){
            System.out.println((char) ch);
        }
        //关流
        fr.close();

2.转换

        //将UTF-8转换为GBK
        //创建转换流 关联文件并且指定字符集
        FileReader fr=new FileReader("a.txt",Charset.forName("UTF-8"));
        FileWriter fw=new FileWriter("c.txt",Charset.forName("GBK"));

        int len;
        while((len=fr.read())!=-1){
            fw.write(len);
        }
        //关流
        fw.close();
        fr.close();

总结

三.序列化流和反序列化流

1.序列化流可以把java的对象写到本地文件中

Serializable接口是一个标记型接口

一旦实现了这个接口表示该类可被序列化

      //创建对象
        Student stu=new Student("zahngsan",555);
        //创建序列化流的对象
        ObjectOutputStream oos=new ObjectOutputStream(new FileOutputStream("a.txt"));
        //写出数据
        oos.writeObject(stu);
        //释放资源
        oos.close();

2.反序列化流

把序列化流在本地文件的对象读出来

  //创建反序列化流对象
        ObjectInputStream ois=new ObjectInputStream(new FileInputStream("a.txt"));
        //读取数据
        Object o=ois.readObject();
        //打印对象
        System.out.println(o);
        //释放资源
        ois.close();

transient关键字,在属性前面加上就不会被序列化

文章来源:https://blog.csdn.net/Ineedmame/article/details/135001728
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。