java.io的缓冲流、转换流、序列化流

本文详细介绍了Java.IO中的缓冲流、转换流和序列化流。缓冲流通过内置缓冲区提高读写效率,包括字节和字符缓冲流。转换流解决字符编码问题,如OutputStreamWriter和InputStreamReader,用于字符到字节的转换。序列化流如ObjectOutputStream和ObjectInputStream用于对象的持久化存储和恢复。文章还提供了编码转换、序列化和反序列化的实例分析与代码实现。
摘要由CSDN通过智能技术生成

缓冲流、转换流、序列化流

缓冲流

概述

缓冲流,也叫高效流,是对4个基本的FileXxx流的增强,所以也是4个流,按照数据类型分类:

  • 字节缓冲流BufferedInputStream,BufferedOutputStrea
  • 字符缓冲流BufferedReader,BufferedWriter

缓冲流的基本原理,是在创建流对象时,会创建一个内置的默认大小的缓冲区数组,通过缓冲去读写,减少系统IO次数,从而提高读写的效率

缓冲流原理

在这里插入图片描述

字节缓冲流

构造方法

public BufferedInputStream(InputStream in):创建一个新的缓冲输入流

public BufferedOutputStream(OutputStream out):创建一个新的缓冲输入流

字节缓冲输入流
import java.io.BufferedOutputStream;
import java.io.FileOutputStream;
import java.io.IOException;

/*
    java.io.BufferedOutputStream extends OutputStream
    BufferedOutputStream:字节缓冲输出流

    继承自父类的共性成员方法:
        - public void close(): 关闭此输出流并释放与此流相关联的任何系统资源
        - public void flush(): 刷新此输出流并强制任何缓冲的输出字节被写出。
        - public void write(byte[]b):将b.length字节从指定的字节数组写入此输出流。
        - public void write(byte[]b, int off, intlen):从指定的字节数组写入len字节,从偏移量off开始输出到此输出流。
        - public abstract void write(int b) :将指定的字节输出流

    构造方法:
        BufferedOutputStream(OutputStream out) 创建一个新的缓冲输出流,以将数据写入指定的底层输出流。
        BufferedOutputStream(OutputStream out, int size) 创建一个新的缓冲输出流,以将具有指定缓冲区大小的数据写入指定的底层输出流。
        参数:
            OutputStream out:字节输出流
                我们可以传递FileOutputStream,缓冲流会给FileOutputStream增加一个缓冲区,提高FileOutputStream的写入效率
            int size:指定缓冲流内部缓冲区的大小,不指定默认
    使用步骤(重点):
        1.创建FileOutputStream对象,构造方法中绑定要输出的目的地
        2.创建BufferedOutputStream对象,构造方法中传递FileOutputStream对象,提高FileOutputStream对象效率
        3.使用BufferedOutputStream对象中的方法write,把数据写入到内部缓冲区中
        4.使用BufferedOutputStream对象中的方法flush,把内部缓冲去的数据,刷新到文件中
        5.释放资源(会先调用flush方法刷新数据,第4步可以省略)

 */
public class Demo01BufferedOutputStream {
   
    public static void main(String[] args) throws IOException {
   
        //1.创建FileOutputStream对象,构造方法中绑定要输出的目的地
        FileOutputStream fos = new FileOutputStream("D:\\IDEA2019(中文版)\\ZXL\\src\\com\\company\\pratise\\IOAndProperties\\a.txt");
        //2.创建BufferedOutputStream对象,构造方法中传递FileOutputStream对象,提高FileOutputStream对象效率
        BufferedOutputStream bos = new BufferedOutputStream(fos);
        //3.使用BufferedOutputStream对象中的方法write,把数据写入到内部缓冲区中
        bos.write("我把数据写入到内部缓冲区中".getBytes());
        //4.使用BufferedOutputStream对象中的方法flush,把内部缓冲去的数据,刷新到文件中
        bos.flush();
        //5.释放资源(会先调用flush方法刷新数据,第4步可以省略)
        bos.close();
    }
}
字节缓冲输出流
import java.io.BufferedInputStream;
import java.io.FileInputStream;
import java.io.IOException;

/*
    java.io.BufferedInputStream extends InputStream
    BufferedInputStream:字节缓冲输入流

    继承自父类的成员方法:
        abstract  int read() 从输入流中读取数据的下一个字节。
        int read(byte[] b) 从输入流中读取一定数量的字节,并将其存储在缓冲区数组 b 中。
        void close() 关闭此输入流并释放与该流关联的所有系统资源。

    构造方法:
        BufferedInputStream(InputStream in) 创建一个 BufferedInputStream 并保存其参数,即输入流 in,以便将来使用。
        BufferedInputStream(InputStream in, int size) 创建具有指定缓冲区大小的 BufferedInputStream 并保存其参数,即输入流 in,以便将来使用。
        参数:
            InputStream in:字节输入流
                我们可以传递FileInputStream,缓冲流会出FileInputStream增加一个缓冲区,提高FileInputStream的读取效率
            int size:指定缓冲流内部缓冲区的大小,不指定默认

    使用步骤(重点):
        1.创建FileInputStream对象,构造方法中绑定要读取的数据源
        2.创建BufferedInputStream对象,构造方法中传递FileInputStream对象,提高FileInputStream对象的读取效率
        3.使用BufferedInputStream对象中的方法read,读取文件
        4.释放资源
 */
public class Demo02BufferInputStream {
   
    public static void main(String[] args) throws IOException {
   
        //1.创建FileInputStream对象,构造方法中绑定要读取的数据源
        FileInputStream fis = new FileInputStream("D:\\IDEA2019(中文版)\\ZXL\\src\\com\\company\\pratise\\IO\\IO_BufferedStream\\a.txt");
        //2.创建BufferedInputStream对象,构造方法中传递FileInputStream对象,提高FileInputStream对象的读取效率
        BufferedInputStream bis = new BufferedInputStream(fis);
        //3.使用BufferedInputStream对象中的方法read,读取文件
        //int read() 从输入流中读取数据的下一个字节
        /*int len = 0;//记录每次读取到的字节
        while ((len = bis.read()) != -1) {
            System.out.println(len);
        }*/

        //int read(byte[] b) 从输入流中读取一定数量的字节,并将其存储在缓冲区数组 b 中
        byte[] bytes = new byte[1024];//存储每次读取的数据
        int len = 0;//记录每次读取的有效字节数
        while ((len = bis.read(bytes)) != -1) {
   
            System.out.println(new String(bytes,0,len));
        }

        //释放资源
        bis.close();
    }
}
效率测试
import java.io.*;

/*
    文件复制练习:一读一写

    明确:
        数据源:c:\\1.jpg
        数据的目的地:d:\\1.jpg
    文件的复制步骤:
        1.创建字节缓冲输入流对象,构造方法中传递字节输入流
        2.创建字节缓冲输出流对象,构造方法中传递字节输出流
        3.使用字节缓冲输入流对象中的方法read,读取文件
        4.使用字节缓冲输出流对象中的方法write,把读取的数据写入到内部缓冲区
        5.释放资源(会先把缓冲切的数据,刷新到文件中)
 */
public class Demo02CopyFile {
   
    public static void main(String[] args) throws IOException {
   
        long s = System.currentTimeMillis();
        //1.创建字节缓冲输入流对象,构造方法中传递字节输入流
        BufferedInputStream bis = new BufferedInputStream(new FileInputStream("d:\\1.png"));
        //2.创建字节缓冲输出流对象,构造方法中传递字节输出流
        BufferedOutputStream bos = new BufferedOutputStream(new FileOutputStream("f:\\1.png"));
        //3.使用字节缓冲输入流对象中的方法read,读取文件
        //一次读取一个字节写入一个字节的方法
        /*int len = 0;
        while((len = bis.read()) != -1){
            //4.使用字节缓冲输出流对象中的方法write,把读取的数据写入到内部缓冲区
            bos.write(len);//2毫秒
        }*/

        //使用数组缓冲读取多个字节,写入多个字节
        byte[] bytes = new byte[1024];
        int len = 0;
        while((len = bis.read(bytes)) != -1){
   
            //4.使用字节缓冲输出流对象中的方法write,把读取的数据写入到内部缓冲区
            bos.write(bytes,0,len);//1毫秒
        }

        //5.释放资源(会先把缓冲切的数据,刷新到文件中)
        bos.close();
        bis.close();


        long e = System.currentTimeMillis();
        System.out.println("复制文件共耗时:" + (e-s) + "毫秒");
    }
}

字符缓冲流

构造方法
  • public BUfferedReader(Reader in):创建一个新的缓冲输入流
  • public BufferedWriter(Writer out):创建一个新的缓冲输出流
字符缓冲输出流
import java.io.BufferedWriter;
import java.io.FileWriter;
import java.io.IOException;

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

ZXLzhuzhu

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值