day10_IO流
1. 缓冲流
1.1 字节缓冲流
- 使用字节缓冲流可以提高字节流读写数据的性能
- 字节缓冲输入流和字节缓冲输出流都自带了8KB缓冲池
构造方法
构造器 | 说明 |
---|---|
public BufferedInputStream(InputStream is) | 把低级的字节输入流包装成一个高级的缓冲字节输入流,从而提高读数据的性能 |
public BufferedOutputStream(OutputStream os) | 把低级的字节输出流包装成一个高级的缓冲字节输出流,从而提高写数据的性能 |
1.2 字符缓冲流
- 字符缓冲输出流和字符缓冲输入流自带8KB的字符缓冲池,可以提高字符输出流写字符数据的性能
构造方法
构造器 | 说明 |
---|---|
public BufferedWriter(Writer r) | 把低级的字符输出流包装成一个高级的缓冲字符输出流管道,从而提高字符输出流写数据的性能 |
public BufferedReader(Reader r) | 把低级的字符输入流包装成字符缓冲输入流管道,从而提高字符输入流读字符数据的性能 |
字符缓冲输出流新增的功能:换行
public void newLine()
字符缓冲输入流新增的功能:按照行读取字符
public String readLine()
2. 转换流
-
不同编码读取出现乱码的问题
- 如果代码编码和被读取的文本文件的编码是一致的,使用字符流读取文本文件时不会出现乱码
- 如果代码编码和被读取的文本文件的编码是不一致的,使用字符流读取文本文件时就会出现乱码
-
解决思路
- 先获取文件的原始字节流,再将其按真实的字符集编码转成字符输入流,这样字符输入流中的字符就不乱码了
2.1 字符输入转换流
构造方法
构造器 | 说明 |
---|---|
public InputStreamReader(InputStream is) | 把原始的字节输入流,按照代码默认编码转成字符输入流(与直接用FileReader的效果一样) |
public InputStreamReader(InputStream is ,String charset) | 把原始的字节输入流,按照指定字符集编码转成字符输入流 |
2.2 字符输出转换流
- 作用
- 可以控制写出去的字符使用什么字符集编码
- 解决思路:
- 获取字节输出流,再按照指定的字符集编码将其转换成字符输出流,以后写出去的字符就会用该字符集编码了
构造方法
构造器 | 说明 |
---|---|
public OutputStreamWriter(OutputStream os) | 可以把原始的字节输出流,按照代码默认编码转换成字符输出流 |
public OutputStreamWriter(OutputStream os, String charset) | 可以把原始的字节输出流,按照指定编码转换成字符输出流 |
3. 打印流
- 作用:
- 打印流可以实现更方便、更高效的打印数据出去,能实现打印啥出去就是啥出去
3.1 PrintStream
- PrintStream继承自字节输出流OutputStream,因此支持写字节数据的方法
构造方法
构造器 | 说明 |
---|---|
public PrintStream(OutputStream/File/String) | 打印流直接通向字节输出流/文件/文件路径 |
public PrintStream(String fileName, Charset charset) | 可以指定写出去的字符编码 |
public PrintStream(OutputStream out, boolean autoFlush) | 可以指定实现自动刷新 |
public PrintStream(OutputStream out, boolean autoFlush, String encoding) | 可以指定实现自动刷新,并可指定字符的编码 |
常用方法
方法 | 说明 |
---|---|
public void println(Xxx xx) | 打印任意类型的数据出去 |
public void write(int/byte[]/byte[]一部分) | 可以支持写字节数据出去 |
3.2 PrintWriter
- PrintWriter继承自字符输出流Writer,因此支持写字符数据出去
构造方法
构造器 | 说明 |
---|---|
public PrintWriter(OutputStream/Writer/File/String) | 打印流直接通向字节输出流/文件/文件路径 |
public PrintWriter(String fileName, Charset charset) | 可以指定写出去的字符编码 |
public PrintWriter(OutputStream out/Writer, boolean autoFlush) | 可以指定实现自动刷新 |
public PrintWriter(OutputStream out, boolean autoFlush, String encoding) | 可以指定实现自动刷新,并可指定字符的编码 |
常用方法
方法 | 说明 |
---|---|
public void println(Xxx xx) | 打印任意类型的数据出去 |
public void write(int/String/char[]/..) | 可以支持写字符数据出去 |
4. 数据流
4.1 数据输出流
- DataOutputStream
- 允许把数据和其类型一并写出去
构造方法
构造器 | 说明 |
---|---|
public DataOutputStream(OutputStream out) | 创建新数据输出流包装基础的字节输出流 |
常用方法
方法 | 说明 |
---|---|
public final void writeByte(int v) throws IOException | 将byte类型的数据写入基础的字节输出流 |
public final void writeInt(int v) throws IOException | 将int类型的数据写入基础的字节输出流 |
public final void writeDouble(Double v) throws IOException | 将double类型的数据写入基础的字节输出流 |
public final void writeUTF(String str) throws IOException | 将字符串数据以UTF-8编码成字节写入基础的字节输出流 |
public void write(int/byte[]/byte[]一部分) | 支持写字节数据出去 |
4.2 数据输入流
- DataInputStream
- 用于读取数据输出流写出去的数据
构造方法
构造器 | 说明 |
---|---|
public DataInputStream(InputStream is) | 创建新数据输入流包装基础的字节输入流 |
常用方法
方法 | 说明 |
---|---|
public final byte readByte() throws IOException | 读取字节数据返回 |
public final int readInt() throws IOException | 读取int类型的数据返回 |
public final double readDouble() throws IOException | 读取double类型的数据返回 |
public final String readUTF() throws IOException | 读取字符串数(UTF-8)据返回 |
public int readInt()/read(byte[]) | 支持读字节数据进来 |
5. 序列化流
- 对象序列化:把Java对象写入到文件中去
- 对象反序列化:把文件里的Java对象读出来
5.1 对象字节输出流
- ObjectOutputStream
构造方法
构造器 | 说明 |
---|---|
public ObjectOutputStream(OutputStream out) | 创建对象字节输出流,包装基础的字节输出流 |
常用方法
方法 | 说明 |
---|---|
public final void writeObject(Object o) throws IOException | 把对象写出去 |
注意:对象如果要参与序列化,必须实现
java.io.Serializable
序列化接口
5.2 对象字节输入流
- ObjectInputStream
构造方法
构造器 | 说明 |
---|---|
public ObjectInputStream(InputStream is) | 创建对象字节输入流,包装基础的字节输入流 |
常用方法
方法 | 说明 |
---|---|
public final Object readObject() | 把存储在文件中的Java对象读出来 |