回顾:
-
InputStream(输入流) 与 OutputStream(输出流) ;Reader(字符读)与Writer(字符写) === > 四个最大的基类
-
InputStream 的子类 FileInputStream
读取文件的一个大致步骤:- 实例化FileInputStream
- 调用其读取的方法read( )
- 关闭资源
-
OutputStream的子类FileOutputStream
写文件大致的步骤:
1. 实例化FileOutputStream
2. 调用其Write( )
3. 关闭资源 -
一般使用的是带缓冲区的流 BufferInputStream和BufferOuputStream (采用第三方的框架)
字符流
乱码:
Reader:用于读取字符流的抽象类,子类是 InputStreamReader==> FileReader
字符读取原理
int read( )
读取单个字符。
int read(char[ ] chars)
将字符读入数组。
int read(char[ ] chars, int off, int len)
指定数组读取的范围
FileReader
读取字符文件的便捷类,调用其构造方法
super(new FileInputStream(file));
与字符流一样还是转换为字节流开始读取,因为GBK 里两个负数表示一个汉字,读取到两个负数之后再把其合拼起来,正数就直接显示了.
注意:
FileReader 用于读取字符流,要读取原始字节流,请考虑使用 FileInputStream
构造方法:
public FileReader(File file)
参数是一个文件的名称
public FileReader(String fileName)
参数是文件的路径
构造方法做的事:
- 实例化这个FileReader
- 把这个FileReader 对象指向要读文件的位置
方法:
int read( )
读取单个字符。
int read(char[ ] cbuf, int offset, int length)
将字符读入数组中的某一部分。
使用 FileReader 的基本步骤:
- 实例化这个类
- 调用其read()方法
- 关闭资源
读取的方式:
- 一个一个字符进行读取:
- 读取多个:
FileWriter:
写入字符流的抽象类,子类 OutputStreamWriter
常规的一些方法 :
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)
写字符串的指定的一部分
注意点:
用于写入字符流,要写入原始字节流,请考虑使用 FileOutputStream
构造:
FileWriter(File file)
FileWriter(String fileName)
构造做的事情:
- 实例化这个FileWriter
- 如果这个文件不存在会创建文件
- 把 FileWriter 执行要写入文件位置
使用 FileWriter 的基本步骤步骤:
- 实例化这个对象
- 调用其写的方法: 用FileWriter 来写自带一个缓冲区(也就是将字符转换成字节)
- 调用其flush() 方法 , 将缓冲区里的数据刷到文件里
- 关闭资源
字符带缓冲区的流: BufferedReader
好处:
从字符输入流中读取文本,缓冲各个字符,从而实现字符、数组和行的高效读取(速度快,效率高)
构造:
public BufferedReader(Reader in)
需要传递一个Reader 对象
方法:
public String readLine()
读取一行数据, 返回值是读取的当前数据
使用缓冲区流来进行读取:
- 实例化 BufferedReader
- 调用 readLine()
- 关闭资源
BufferedWriter:
好处:
将文本写入字符输出流,缓冲各个字符,从而提供单个字符、数组和字符串的高效写入。
构造方法
public BufferedWriter(Writer out)
传递了 一个Writer 对象
方法:
public void newLine( )
等同于"\r\n" ==>也就是换行
使用缓冲区流来写入数据的一个基本步骤:
- 实例化 BufferedWriter
- 调用其write()
- 关闭资源
转换流 InputStreamReader:
字节流通向字符流的桥
构造方法:
public InputStreamReader(InputStream in,Charset cs)
第一个参数是一个 InputStream;第二个参数传递的是要设置的编码格式
常规的方法:
read();
步骤
- 实例化InputStreamReader
- 调用其读的方法
- 关闭资源
OutputStreamWriter:
字符流通向字节流的桥梁
构造方法:
public OutputStreamWriter(OutputStream out,Charset cs)
第一个参数是: 输出流对象 , 第二个:设置编码格式
常规的方法:
write()
步骤
- 实例化OutputStreamWriter
- 调用其写的方法
- 关闭资源
对象流: ObjectOutputStream
把对象写入到文件里,父类是OutputStream
构造:
public ObjectOutputStream(OutputStream out)
需要来传递OutputStream, 可以构建一个文件地址或者是文件
写的方法:
public final void writeObject(Object obj)
这个方法就是写一个对象
步骤:
- 实例化ObjectOutputStream
- 调用写的方法
- 关闭资源
java.io.NotSerializableException api:当实例需要具有序列化接口时,抛出此异常 (序列化异常)
序列化: 把对象转换成字节序列==>才能保存在文件里
反序列化:把字节序列转换成对象 ==> 方便读取
ObjectInutputStream
把文件中的对象读取出来
注意点:
ObjectInputStream 对以前使用 ObjectOutputStream 写入的基本数据和对象进行反序列
构造方法:
ObjectInputStream(InputStream in)
读对象的方法:
public final Object readObject( )
步骤:
- 实例化ObjectInputStream
- 调用读的方法
- 关闭资源