IO流之Writer、Reader详解

前言

  • 学习之前,需要对IO流的分类有个简单的认识,下列是关于本文的IO流分类介绍

IO流的分类

  • 按流的方向划分
    • 输入流
    • 输出流
  • 按流动的数据类型划分
    • 字节流
    • 字符流

本文提到的Reader、Writer属于字符流

  • 字符流
    • 输入流
      • 顶级父类Reader
    • 输出流
      • 顶级父类Writer
  • 字符流用于对文字进行读写操作,能够解决字节流读写字符产生的乱码问题

一、Writer

1、概述

  • 用于写入字符流的抽象类
    • 也就是字符输出流的顶级父类

2、常用API

abstract void close()

  • 关闭流,并使用flush()方法清除缓存区内容

abstract void flush()

  • 将缓存区的内容刷新到文件中
    • 字符输出的时候,通常需要在后面跟上一个flush()操作,否则字符会保留在缓存中,而不是写入到文件中

void write(char[] cbuf)

  • 写一个字符数组到文件中
  • void write(char[] cbuf, int off, int len)
    • 写一个字符数组到文件中,从off位置开始,写len个字符

void write(int c)

  • 写一个字符到文件中

void write(String str)

  • 写一个字符串到文件中
  • void write(String str, int off, int len)
    • 写一个字符串到文件中,从off位置开始,写len个字符

Writer append(char c)

  • 将指定的字符追加到此字符输出流中
    • 返回的是this,也就是调用该方法的字符输出流对象
      • 调用该方法的对象,和该方法返回的对象是同一个对象
    • 因此可以使用链式添加,即字符输出流对象.append(xxx).append(xxx).append(xxx)...

二、FileWriter

1、概述

  • 是字符输出流(Writer)的常用子类

2、构造方法分析

FileWriter(File file)

  • 根据传入的文件构造一个字符输出流对象
  • 如果对象不存在会自动创建

FileWriter(File file, boolean append)

  • 根据传入的文件构造一个字符输出流对象
  • append
    • true
      • 表示在file文件原有数据的基础上,继续写入数据
    • false(默认)
      • 表示把file文件的内容清空后,再写入数据

FileWriter(File file,Charset charset)

  • 根据传入的文件构造一个字符输出流对象
  • 指定字符输出流对象的字符集编码

FileWriter(String fileName)

  • 同FileWriter(File file),区别在于本构造器是使用文件的路径来创建字符输出流对象

FileWriter(String fileName, boolean append)

  • 同FileWriter(File file, boolean append),区别在于本构造器是使用文件的路径来创建字符输出流对象

FileWriter(String fileName, boolean append,Charset charset)

  • 同FileWriter(File file, boolean append,Charset charset),区别在于本构造器是使用文件的路径来创建字符输出流对象

3、举例

  • 写入单个字符
public static void main(String[] args) throws IOException {
        File file = new File("I:\\a.txt");
        FileWriter writer = new FileWriter(file);
        //写入一个字符
        writer.write('c');
        writer.close();
    }
  • 写入一个字符串

    • 如果不用close方法,必须使用flush方法,否则数据缓存在内存中,无法写入文件

 public static void main(String[] args) throws IOException {
        File file = new File("I:\\a.txt");
        FileWriter writer = new FileWriter(file);
        //写入一组字符
        writer.write("锄禾日当午,汗滴禾下土");
        writer.flush();
//        writer.close();
    }

三、Reader

1、概述

  • 用于读取字符流的抽象类
    • 也就是字符输入流的顶级父类

2、常用API

abstract void close()

  • 关闭流对象并释放与其关联的所有系统资源

int read()

  • 读取一个字符

int read(char[] buf)

  • 读取字符并存入buf数组

abstract int read(char[] cbuf, int off, int len)

  • 从输入流中读取一些字符,存储到字符缓冲数组b中,并从off下标开始,读取b数组的len个数据

四、FileReader

1、概述

  • 是字符输入流(Reader)的常用子类

2、构造器分析

FileReader(File file)

  • 根据传入的文件对象创建字符输入流对象

FileReader(File file,Charset charset)

  • 根据传入的文件对象创建字符输入流对象
  • 指定字符输入流对象的字符集编码为charset

FileReader(String fileName)

  • 根据传入的文件路径创建字符输入流对象

FileReader(String fileName,Charset charset)

  • 根据传入的文件路径创建字符输入流对象
  • 指定字符输入流对象的字符集编码为charset

3、举例

  • 读取a.txt文件内容,打印内容为:“锄禾日当午,汗滴禾下土”
public static void main(String[] args) throws IOException {
        File file = new File("I:\\a.txt");
        FileReader reader = new FileReader(file);
        //一次读取11个字符
        char[] chars = new char[11];
        //读取字符的个数
        int len = -1;
        while ((len = reader.read(chars))!=-1){
            System.out.println(new String(chars,0,len));
        }
        reader.close();
    }

猜你喜欢

转载自blog.csdn.net/future_god_qr/article/details/121193619
今日推荐