java IO流: 字符输入输出流FileReader/FileWriter

使用字节流读取中文的问题

  • 1个中文占用的不只一个字节
    • GBK:两个字节
    • UTF-8:三个字节
  • 所以字节流在读取中文字符时会产生乱码
FileInputStream fis=new FileInputStream("D:\\document\\code\\xuexi\\java\\aaa\\a.txt");//你好(换行)欸嘿
        int len=0;
        while ((len=fis.read())!=-1){
            System.out.print((char)len);
        }
        fis.close();
//结果
//你好
//欸嘿
  • java提供了一些字符流类,以字符为单位读写数据,专门用于处理文本文件

字符输入流 Reader类

  • 用于读取字符流的抽象类。子类必须实现的方法只有read(char[], int, int)close()。但是,多数子类将重写此处定义的一些方法,以提供更高的效率和/或其他功能。
  • 字符输入流的最顶层的父类,定义了一些共性的成员方法
  • int read()读取单个字符。
  • int read(char[] cbuf) 将字符读入数组。
  • void close()关闭该流并释放与之关联的所有资源。
  • 字符流,只能操作文本文件,不能操作图片,视频等非文本文件。
  • 当我们单纯读或者写文本文件时 使用字符流,其他情况使用字节流

类 FileReader

  • class FileReader extends InputStreamReader extends Reader
  • 文件字符输入流
  • 把硬盘文件中的数据以字符的方式读取到内存中

构造方法

  • FileReader(File file) :在给定从中读取数据的 File 的情况下创建一个新 FileReader。
  • FileReader(String fileName) :在给定从中读取数据的文件名的情况下创建一个新 FileReader。

public class Demo {
    public static void main(String[] args) throws IOException {
        FileReader fis=new FileReader("D:\\document\\code\\xuexi\\java\\aaa\\a.txt");
        int len=0;
        while ((len=fis.read())!=-1){
            System.out.print((char)len);//你好欸嘿www===
        }
        fis.close();
    }
}
public class Demo {
    public static void main(String[] args) throws IOException {
        FileReader fis=new FileReader("D:\\document\\code\\xuexi\\java\\aaa\\a.txt");
        int len=0;
        char[] cs=new char[1024];
        while ((len=fis.read(cs))!=-1){
            System.out.println(new String(cs,0,len));//你好欸嘿www===
        }
        fis.close();
    }
}



字符输出流 Writer类

  • 写入字符流的抽象类。子类必须实现的方法仅有 write(char[], int, int)flush() close()。但是,多数子类将重写此处定义的一些方法,以提供更高的效率和/或其他功能。
  • 是所有字符输出流的最顶层的父类
  • void close() 关闭此流,但要先刷新它。
  • abstract void flush() 刷新该流的缓冲。
  • abstract void write(char[] cbuf, int off, int len) 写入字符数组的某一部分。
  • void write(String str) 写入字符串。
  • void write(String str, int off, int len) 写入字符串的某一部分。
  • 因为内置缓冲区的原因,如果不关闭输出流,无法写出字符到文件中。但是关闭的流对象,是无法继续写出数据的。如果我们既想写出数据,又想继续使用流,就需要flush 方法了。

类 FileWriter

  • class FileWriter extends OutputStreamWriter extends Writer
  • 文件字符输出流
  • 把内存中字符数据写入到文件中
  • 使用步骤:
    1. 创建FileWriter对象,构造方法中绑定要写入数据的目的地
    2. 使用FileWriter中的方法write,把数据写入到内存缓冲区中(字符转换为字节的过程)
    3. 使用FileWriter中的方法flush,把内存缓冲区中的数据刷新到文件中
    4. 释放资源(会先把内存缓冲区中的数据刷新到文件中)

构造方法

  • FileWriter(File file)根据给定的 File 对象构造一个 FileWriter 对象。
  • FileWriter(String fileName) 根据给定的文件名构造一个 FileWriter 对象。
  • FileWriter(String fileName, boolean append) 根据给定的文件名以及指示是否附加写入数据的 boolean 值来构造 FileWriter 对象。
  • FileWriter(File file, boolean append) 根据给定的 File 对象构造一个 FileWriter 对象。
  • boolean append:续写开关,true不会创建新的文件覆盖原文件,可以续写
  • 换行:写换行符号
    • Windows:\r\n
    • Linux:/n
    • mac:/r
public class Demo {
    public static void main(String[] args) throws IOException {
        FileWriter fw=new FileWriter("D:\\document\\code\\xuexi\\java\\aaa\\a.txt");
        fw.write("abc");
        //如果没有调用刷新或关闭方法,数据是不会刷新到文件中的
        fw.flush();
        fw.close();

    }
}
posted @ 2021-01-06 18:15  迪迦是真的  阅读(447)  评论(0)    收藏  举报
//复制代码按钮 //代码行号 //评论