字符流
Reader :
用于读取字符流的抽象类 子类是 InputStreamReader==> FileReader
提供了很多公有的方法:
int read() 读取单个字符。
int read(char[] cbuf) 将字符读入数组。
int read(char[] cbuf, int off, int len) 指定数组读取的范围
FileReader
来读取字符文件的便捷类 ==> super(new FileInputStream(file)); 还是转换为字节流开始读取 == > GBK , 因为GBK 里两个负数表示一个汉字,读取到两个负数之后再把其合拼起来,正数就直接显示了.
注意:FileReader 用于读取字符流。要读取原始字节流,请考虑使用 FileInputStream
构造方法: public FileReader(File file) 参数是一个文件的名称
public FileReader(String fileName) 文件的路径
构造做的事:
1.实例化这个FileReader
2. 把这个FileReader 对象指向要读文件的位置
方法: int read() 读取单个字符。
int read(char[] cbuf, int offset, int length) 将字符读入数组中的某一部分。
使用 FileReader 的基本步骤:
1.实例化这个类
2.调用其read()方法
3. 关闭资源
读取的方式:
1.一个一个字符进行读取, read()
2.读取多个 read(char c)
Writer:
写入字符流的抽象类 子类 OutputStreamWriter ==> FileWriter
常规的一些方法 :
close() 关闭此流,但要先刷新它。
abstract void flush() 刷新该流的缓冲。
void write(char[] cbuf) 写入字符数组。
abstract void write(char[] cbuf, int off, int len) 写入字符数组的某一部分。
void write(int c) 写入单个字符。
void write(String str) 写入字符串。
void write(String str, int off, int len) 写字符串的指定的一部分
FileWriter: 用来写入字符文件的便捷类
注意点:用于写入字符流。要写入原始字节流,请考虑使用 FileOutputStream
构造方法:FileWriter(File file)
FileWriter(String fileName)
构造:
1.实例化这个FileWriter
2. 如果这个文件不存在会创建文件
3. 把 FileWriter 执行要写入文件位置
步骤:
1.实例化这个对象
2.调用其写的方法: 用FileWriter 来写自带一个缓冲区(也就是将字符转换成字节)
3.调用其flush() 方法 , 将缓冲区里的数据刷到文件里
4.关闭资源
字符为啥不能读取图片以及视频: 原因: 字符流最终还是字节流进行读取 ==> 只是做了一个处理的功能
(是如何把字节转换成字符) 转换的依据: 对应的某码 Utf-8 GBK ASCALL ==> 就会出现图片视频丢位
图片 与视频打不开(图片打码不一样)
字符带缓冲区的流:
BufferedReader
好处:从字符输入流中读取文本,缓冲各个字符,从而实现字符、数组和行的高效读取(速度快,效率高)
构造: public BufferedReader(Reader in) 需要传递一个Reader 对象
方法:public String readLine() 读取一行数据 返回值是读取的当前数据
使用缓冲区流来进行读取:
1.实例化 BufferedReader
2.调用 readLine()
3.关闭资源
BufferedWriter:
好处: 将文本写入字符输出流,缓冲各个字符,从而提供单个字符、数组和字符串的高效写入。
构造方法 public BufferedWriter(Writer out) 传递了 一个Writer 对象
独特的方法: public void newLine() 等同于"\r\n" ==>也就是换行
使用缓冲区流来写入数据的一个基本步骤:
1.实例化 BufferedWriter
2.调用其write()
3.关闭资源
转换流
使用 文件输入流与输出流 ==>乱码 >产生乱码的原因> 就是因为两端的编码解码的方式不一样 ===> 系统文件默认的编码格式是GBK ==>idea 默认的编码格式是UTF-8(万国码) => 可以解决这个问题,也就是在读取操作的时候,来查找其编码格式>两端统一(转换流)
InputStreamReader: 字节流通向字符流的桥
建议:为了达到最高效率,可要考虑在 BufferedReader 内包装 InputStreamReader
构造方法: public InputStreamReader(InputStream in,Charset cs)
第一个参数是一个 InputStream,第二个参数传递的是要设置的编码格式
常规的方法:read();
步骤
1.实例化InputStreamReader
2. 调用其读的方法
3.关闭资源
OutputStreamWriter:字符流通向字节流的桥梁
建议:为了获得最高效率,可考虑将 OutputStreamWriter 包装到 BufferedWriter 中,以避免频繁调用转换器
构造方法: public OutputStreamWriter(OutputStream out,Charset cs)
第一个参数是: 输出流对象 , 第二个:设置编码格式
常规的方法:write()
步骤
1. 实例化OutputStreamWriter
2. 调用其写的方法
3.关闭资源
对象流:
ObjectOutputStream ==> 把对象写入到文件里 父类是OutputStream
构造:public ObjectOutputStream(OutputStream out) 需要来传递OutputStream 可以构建一个文件地址或者是文件
写的方法: public final void writeObject(Object obj) 这个方法就是写一个对象
步骤:
1.实例化ObjectOutputStream
2.调用写的方法
3.关闭资源
java.io.NotSerializableException api:当实例需要具有序列化接口时,抛出此异常 (序列化异常)
serialVersionUID 相当于对象序列化的唯一表示符, 如果在序列化的时候,不加这个标识符系统会给
生成一个标识符, 只要修改类的信息就会生成一个新的表示符 ,所有产生了这个问题:
解决方式:给其生成一个标识符UID
序列化: 把对象转换成字节序列==>才能保存在文件里
反序列化:把字节序列转换成对象 ==> 方便读取
写对象的时候必须序列化:
步骤:
1.实现序列化的接口
2.需要生成一个唯一的表示符
ObjectInutputStream 把文件中的对象读取出来
注意点: ObjectInputStream 对以前使用 ObjectOutputStream 写入的基本数据和对象进行反序列
构造方法:ObjectInputStream(InputStream in)
读对象的方法:public final Object readObject()
步骤:
1.实例化ObjectInputStream
2.调用读的方法
3.关闭资源