文件操作做字符流和缓冲流简介

1.文件操作字符输出流
FileWriter(File file)根据File类对象创建对应的文件输出字符流
FileWriter(String pathName)根据string类型文件路径创建对应的文件输出字符流
!!!上边为删除写
FileWriter(File file,boolean append)
FileWriter(String pathName,boolean append)
!!!上边引入boolean类型append变量,实现追加写
创建FileWwiter对象时,如果文件不存在,路径合法,会自动创建
成员方法:
void write(int char)写入一个char类型数据到文件
void write(char[] arr)写入一个char类型数组到文件
void write(char[] ,int offset,int length)写入一个char类型数组,从指定位置传指定长度到文件
2.缓冲流
2.1缓冲流的作用
使用缓冲数组以后,整体的读取,写入效率提升很大!!! 降低了CPU通过内存访问硬盘的次数。提高效率,降低磁盘损耗。
2.2常用缓冲流
字节输入缓冲 BufferedInputStream
字节输出缓冲 BufferedOutputStream
字符输入缓冲 BufferedReader
字符输出缓冲 BufferedWrite
!!!所有的缓冲流都没有任何的读取,写入文件能力,这里都 需要对应的输入流和输出流来提供对应的能力。在创建缓冲流流对象时,需要传入对应的输入流对象和输 出流对象。底层就是提供了一个默认大小的缓冲数组,用于提高效率
2.2.1字节缓冲流
输入 BufferedInputStream(InputStream in);
这里需要的对象是一个字节输入流基类对象。同时 也可也传入InputStream子类对象 输出
BufferedOutputStream(OutputStream out);
这里需要的对象是一个字节输出流基类对象。同时 也可也传入OutputStream子类对象
以上传入的InputStream和OutputStream都是用于提供对应 文件的读写能力。
!!字节输入流缓冲效率问题:

  1. 在BufferedInputStream底层中有一个默认容量为8KB的 byte类型缓冲数组。
  2. fill方法是一个操作核心

a. 从硬盘中读取数据,读取的数据容量和缓冲数组容量 一致。
b. 所有的read方法,都是从缓冲数组中读取数据
c. 每一次读取数据之前,都会检查缓冲区内是否有数 据,如果没有,fill方法执行,填充数据。

  1. 利用缓冲,fill方法,可以极大的降低CPU通过内存访问 硬盘的次数。同时程序操作的数据是在内存中进行交互的。
    !!字节输出流缓冲效率问题
  2. 在BufferedOutputStream类对象,默认有一个8KB的 byte类型缓冲数组
  3. 数据写入文件时并不是直接保存到文件中,而是保存在内 存8KB字节缓冲数组中
  4. 如果8KB空间填满,会直接flush缓冲区,数据保存到硬盘 中,同时清空整个缓冲区。
  5. 在BufferedOutputStream关闭时,首先会调用flush方 法,保存数据到文件,清空缓冲区,并且规划缓冲区占用内 存,同时关闭缓冲流使用的字节输出流。

2.2.2字符缓冲流
BufferedReader
字符缓冲输入流
BufferedReader(Reader reader);
BufferedWriter
字符缓冲输出流
BufferedWriter(Writer writer);

  1. 字符缓冲输入流,底层有一个8192个元素的缓冲字符数组,而且使用fill方法从硬盘中读取数据填充缓冲数组

  2. 字符缓冲输出流,底层有一个8192个元素的缓冲字符数组,使用flush方法将缓冲数组中的内容写入到硬盘当中。

  3. 使用缓冲数组之后,程序在运行的大部分时间内都是内存和内存直接的数据交互过程。内存直接的操作效率是比较高的。并且降低了CPU通过内存操作硬盘的次数

  4. 关闭字符缓冲流,都会首先释放对应的缓冲数组空间,并且关闭创建对应的字符输入流和字符输出流。

  5. 字符缓冲输入流中
    String readLine(); 读取一行数据
    字符缓冲输出流中
    void newLine(); 换行
    3.序列化
    3.1序列化概述
    Java中提供了一种序列化操作的方式,用一个字节序列化来表示一个对象,该字节序列化中保存了【对象的属性】,【对象的类型】和【对象的数据】。把字节序列化保存到文件中,就可以做到持久化保存数据内容。
    从文件中读取字节序列化数据,可以直接得到对应的对象。
    3.2ObjectOutputStream类 将对象数据序列化,保存到文件中
    构造方法 Constructor
    ObjectOutputStream(OutputStream out);
    输出字节流对象作为当前方法的参数
    3.3ObjectInputStream类 从文件中读取被序列化之后的字节数据,提供反序列化操作,得到一个对象。
    构造方法 Constructor
    ObjectInputStream(InputStream in);
    需要提供一个字节输入流对象来进行操作
    !!!注意事项:

  6. 如果一个类需要进行序列化操作,必须遵从。java.io.Serializable。不遵从无法进行序列化操作

  7. 序列化之后从文件中读取序列化内容,转换成对应的对象,
    ClassNotFoundException 对应类没有找到。
    对应的类型没有导包,不存在…
    InvalidClassException 类型不一样
    序列化之后的每一个类都会有一个serialVersionUID,该编号在使用过程中,序列化
    和反序列化必须一致

  8. transient 修饰的成员变量不能被序列化

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值