Java基础:字符流,转换流,对象流

字符流

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.关闭资源

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值