day10_IO流

49 阅读5分钟

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对象读出来