days20--IO流之字符流
Posted 安小猿
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了days20--IO流之字符流相关的知识,希望对你有一定的参考价值。
字符流:
字节流操作中文可能会出现乱码的情况(按照一个一个字节,中文存储的是多个字节) ,而按照字符一起进行操作
字符输出流
Wrtier:是字符输出流所有类的抽象父类
构造: OutputStreamWriter(OutputStream out)
注意: 字符流构造中的参数不是具体的文件路径 而是字节流对象
说明了字符流操作具体的文件内容时,本质上还是通过字节流操作
方法:
void write(int c) 写一个字符
void write(char[] cbuf) 写一个字符数组
void write(char[] cbuf,int off,int len) 写一个字符数组的一部分
void write(String str) 写一个字符串
void write(String str,int off,in len) 写一个字符串的一部分
flush():把数据刷新到文件中
注意:字符流底层是字节流,先把字节流中的数据写入到字符流中,然后在写入到文件,close()可以把字符流中的数据写入到文件中,如果没有close就使用flush
字符输入流:
按照字符一个一个读入程序
Reader:是字符输出流所有类的抽象父类
常见字符输入流
1.InputStreamReader:从字节流到字符流的桥梁(InputStreamReader构造器入参是FileInputStream的实例对象),它读取字节并使用指定的字符集将其解码为字符。它使用的字符集可以通过名称指定,也可以显式给定,或者可以接受平台的默认字符集。
2.BufferedReader:从字符输入流中读取文本,设置一个缓冲区来提高效率。BufferedReader是对InputStreamReader的封装,前者构造器的入参就是后者的一个实例对象。
3. FileReader:用于读取字符文件的便利类,new FileReader(File file)等同于new
InputStreamReader(new FileInputStream(file,true),“UTF-8”),但FileReader不能指定字符编码和默认字节缓冲区大小。
4. PipedReader:管道字符输入流。实现多线程间的管道通信。
5. CharArrayReader:从Char数组中读取数据的介质流。
6. StringReader:从String中读取数据的介质流。
构造:InputStreamReader(InputStream in)
方法:
void read() 读一个字符
void read(char[] cbuf,int offset,int len)
将字符读入数组的一部分
字符流的简便写法
使用子类FileWriter(抽象路径)和FileReader(抽象路径)
注意:
FileWriter和FileReader不能指定编码集,只能使用默认的编码
字符缓冲流:
为了避免操作数据时,多次调用底层系统。针对与数据有简便快捷的操作(内部含有一个8192的char数组)
BufferedReader:从字符输入流读取文本,缓冲字符,以提供字符,数组和行的高效读取。 可以指定缓冲区大小,或者可以使用默认大小。
默认值足够大,可用于大多数用途。
BufferedWriter:将文本写入字符输出流,缓冲字符,以提供单个字符,数组和字符串的高效写入。可以指定缓冲区大小,或者可以接受默认大小。 默认值足够大,可用于大多数用途。
构造方法:
BufferedReader(Read in);
BufferedWriter(Write out);
注意:BufferedRead中有一个readLine()方法可以一次性读入一行数据
对象序列化
序列化就是将对象的状态信息转化为可以存储或者传输的形式的过程。
这种机制就是使用一个字节序列表示一个对象,该字节序列包含:对象的类型和对象中存储的对象详细信息,字节序列写入到文件之后,相当于文件持久保存了一个对象的信息 反之,该字节序列也可以从文件中读取对象信息,称之为反序列化。
对象流:
对象序列化流:ObjectOutputStream(OutputStream out)
对象反序列化流:ObjectInputStream(InputStream input)
方法:
writeObject(Object o);
readObject();
序列化一个类,当前类必须去实现Serializable接口
Serializable是一个标识(标识当前类可以进行序列化或反序列化)接口,实现该接口,不需要重写任何方法
序列化一个对象之后,类文件发生更改,出现InvalidClassException:因为当序列化运行时检测到类中的以下问题之一时抛出。
类的串行版本与从流中读取的类描述符的类型不匹配
该类包含未知的数据类型
该类没有可访问的无参数构造函数
解决方案:
在类中增加一个版本标识信息(序列化对象时,会由系统分配的版本标识) protected static final long serialVersionUID = 42L;
成员变量如何不被序列化?
给该成员加上一个transient关键字修饰,标识了该成员不参与序列化
以上是关于days20--IO流之字符流的主要内容,如果未能解决你的问题,请参考以下文章