io流-缓存流和字节缓存流和缓冲区文件拷贝
我们要见识一下强大的流 比如能够高效读写的缓存流 能够转换编码 能够持久化存储对象的序列化流等等 这些功能强大的流 都是在基本的流对象基础之上创建而来的 就像穿上铠甲的武士一样 相当于是对基本流对象的一种增强
缓存流概述
缓存流也称高效流 是对4个基本的Filexx流的增强 所以也是4个流 按照数据类型分类:
- 字节缓存流:BufferedInputStream,BufferedOutStream
- 字符缓存流:BufferedReader,BufferedWiter
缓存流的基本原理 是在创建流对象时 会创建一个内置的默认大小的缓存区 通过缓冲区读写 减少系统Io次数 从而提高读写的效率
字节缓存流
构造方法
public BufferedInoutStream(InputStream in):创建一个新的缓存输入流 public BufferedOutputStream(OutputStream out):创建一个新的缓存输出流
字节缓存输出流
BufferedOutPutStream字节缓冲输出流
继承自父类的共性成员方法:
public void close():关闭此输出流并释放与此流相关联的任何系统资源 public void flush():刷新此输出流并强转任何缓冲的输出字节被写出 public void write(byte[] b):将b.length字节从指定的字节数组写入此输出流 public void write(byte[] b,int off,int len):从指定的字节数组写入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 static void main(String[] args) throws IOException { FileOutputStream os = new FileOutputStream("E:\\dest\\b.txt"); BufferedOutputStream bos = new BufferedOutputStream(os); byte[] bytes = {97, 98, 99, 100, 101, 102}; bos.write(bytes); bos.close(); }
运行前:
运行结果:
运行后:
b.txt
字节缓存输入流
BufferedInputStream:字节缓存输入流
继承父类的成员方法:
int read():从输入流中读取数据的下一个字节 int read(byte[] b):从输入流中读取一定数量的字节 并将其存储在缓冲区数字b中 void close():关闭此输入流并释放与该流关联的所有系统资源
构造方法:
BufferedInputStream(InputStream in):创建一个BufferedInputStream并保存其参数 即输入流in 以便将来使用 BufferedInputStream(InputStram in,int size):创建具有指导缓冲区大小的BufferedInputStream 并保持其参数 即输入流in 以便将来使用
参数:
InputStream in:字节输出流 我们可以传递FileInputStream 缓冲流会给FileInputStream增加一个缓冲区 提高FileInputStream的写入效率
int size:指定缓冲流内部缓冲区的大小 不指定默认
使用步骤:
1.创建FileInputStream对象 构造方法中绑定要读取的数据源
2.创建BufferedInputStream对象 构造方法中传递FileInputStream对象 提高FileInputStream对象的读取效率
3.使用BufferedInputStream对象中的方法read 读取文件
4.释放资源
代码:
public static void main(String[] args) throws IOException { FileInputStream fis = new FileInputStream("E:\\dest\\b.txt"); BufferedInputStream bis = new BufferedInputStream(fis); byte[] bytes = new byte[1024]; int len =0; while ((len=bis.read(bytes))!=-1){ System.out.println(new String(bytes,0,len)); } bis.close(); fis.close(); }
运行结果:
使用缓存区进行文件复制并记录时间
代码:
public static void main(String[] args) throws IOException { long end = System.currentTimeMillis(); FileInputStream fis = new FileInputStream("E:\\eula.1031.txt"); FileOutputStream fos = new FileOutputStream("D:\\file\\eula.1031.txt"); BufferedInputStream bis = new BufferedInputStream(fis); BufferedOutputStream bos = new BufferedOutputStream(fos); byte[] bytes=new byte[1024]; int len=0; while ((len=bis.read(bytes))!=-1){ bos.write(bytes,0,len); } bis.close(); fis.close(); bos.close(); fos.close(); long and = System.currentTimeMillis(); System.out.println("耗时"+(and-end)); }
运行结果
运行后
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 被坑几百块钱后,我竟然真的恢复了删除的微信聊天记录!
· 【自荐】一款简洁、开源的在线白板工具 Drawnix
· 没有Manus邀请码?试试免邀请码的MGX或者开源的OpenManus吧
· 园子的第一款AI主题卫衣上架——"HELLO! HOW CAN I ASSIST YOU TODAY
· 无需6万激活码!GitHub神秘组织3小时极速复刻Manus,手把手教你使用OpenManus搭建本