Java学习日志(十九): 字符输出流,字符输入流

JavaEE学习日志持续更新----> 必看!JavaEE学习路线(文章总汇)

Java学习日志(十九)

  • 字符流
    • Reader
      • FileReader
    • Writer
      • FileWriter

字符流

字节流读取中文时,由于一次只能读写一个字节,一次不能把整个中文字符读全(UTF-8:1个中文=3个字节,GBK:1个中文=2个字节),会出现乱码,所以我们需要使用字符流。

字节流与字符流的区别

  • 字节流:一次读写一个字节
  • 字符流:一次读写一个字符

Reader

java.io.Reader:字符输入流
此抽象类是表示所有字符输入流的超类

里边定义了所有字符输入流共性的成员方法

  • public void close() :关闭此流并释放与此流相关联的任何系统资源。
  • public int read() : 一次读取一个字符,并返回;读取到文件结尾返回-1
  • public int read(char[] cbuf) : 一个读取多个字符,存储到数组中,返回的是每次读取的有效字符个数

FileReader

java.io.FileReader extends InputStreamReader extends Reader:文件字符输入流

作用:把硬盘文件中的数据,以字符的方式读取到内存中
构造方法

  • FileReader​(File file)
  • FileReader​(String fileName)
    参数:读取文件的数据源

构造方法的作用

  1. 创建FileReader对象
  2. 把FileReader对象指向读取文件的第一个字符

底层原理:

java程序-->JVM-->OS-->OS读取数据的方法-->读取文件

使用步骤

  1. 创建字符输入流FileReader对象,构造方法中绑定要读取的数据源
  2. 使用FileReader对象中的方法read,读取文件
  3. 释放资源

示例一:public int read() : 一次读取一个字符,并返回;读取到文件结尾返回-1

public class Demo01 {
    public static void main(String[] args) throws IOException {
        //1.创建字符输入流FileReader对象,构造方法中绑定要读取的数据源
        FileReader fr = new FileReader("day10\\2.txt");//你好
        //2.使用FileReader对象中的方法read,读取文件
        //public int read() : 一次读取一个字符,并返回;读取到文件结尾返回-1
        int len = 0;
        while((len = fr.read())!=-1){
            System.out.println((char)len);
        }
        
        
        //3.释放资源
        fr.close();

    }
}

示例二:public int read(char[] cbuf) : 一个读取多个字符,存储到数组中,返回的是每次读取的有效字符个数

public class Demo01 {
    public static void main(String[] args) throws IOException {
        //1.创建字符输入流FileReader对象,构造方法中绑定要读取的数据源
        FileReader fr = new FileReader("day10\\2.txt");//你好
        //2.使用FileReader对象中的方法read,读取文件
        //public int read() : 一次读取一个字符,并返回;读取到文件结尾返回-1
        /*int len = 0;
        while((len = fr.read())!=-1){
            System.out.println((char)len);
        }*/
        //public int read(char[] cbuf) : 一个读取多个字符,存储到数组中,返回的是每次读取的有效字符个数
        char[] chars = new char[1024];
        int len = 0;
        while((len = fr.read(chars))!=-1){
            System.out.println(new String(chars,0,len));
        }

        //3.释放资源
        fr.close();

    }
}

Writer

java.io.Writer:字符输出流
此抽象类是表示所有字符输出流的超类

里边定义了所有字符输出流共性的成员方法

  • public abstract void close() :关闭此输出流并释放与此流相关联的任何系统资源。
  • public abstract void flush() :刷新此输出流并强制任何缓冲的输出字符被写出。
  • public void write(int c) :写出一个字符。
  • public void write(char[] cbuf) :将 b.length字符从指定的字符数组写出此输出流。
  • public abstract void write(char[] b, int off, int len) :从指定的字符数组写出 len字符,从偏移量 off开始输出到此输出流。
  • public void write(String str) :写出一个字符串。
  • public void write​(String str, int off, int len) 写一个字符串的一部分。

FileWriter

java.io.FileWriter extends OutputStream extends Writer:字符输出流

作用:把内存中的数据,以字符的方式写入到文件

构造方法

  • FileWriter​(File file)
  • FileWriter​(String fileName)
    参数:写入数据的目的地

构造方法的作用

  1. 会根据构造方法传递的文件/文件的路径,创建一个空文件
  2. 创建FileWriter对象
  3. 把FileWriter对象指向创建的文件

写入数据的底层原理

java-->JVM-->OS--OS写数据的方法-->把数据写入到文件中

字符输出流的使用步骤

  1. 创建字符输出流FileWriter对象,构造方法中绑定要写入的目的地
  2. 使用FileWriter对象中的方法write,把数据写入到内存缓冲区中(转换 字符–>字节)
  3. 使用FileWriter对象中的方法flash,把内存缓冲区中的数据刷新到文件中
  4. 释放资源

示例: public void write(int c) :写出一个字符

public class Demo03 {
    public static void main(String[] args) throws IOException {
        //1.创建字符输出流FileWriter对象,构造方法中绑定要写入的目的地
        FileWriter fw = new FileWriter("day10\\3.txt");
        //2.使用FileWriter对象中的方法write,把数据写入到内存缓冲区中(转换 字符-->字节)
        fw.write(97);
        //3.使用FileWriter对象中的方法flush,把内存缓冲区中的数据刷新到文件中
        //fw.flush();
        //4.释放资源(流关闭前,会自动的先调用flush方法,刷新数据)
        fw.close();

    }
}

关闭与刷新
close方法和flush方法区别:

  • flush方法:刷新缓冲区,流对象可以继续使用。
  • close方法:关闭流,释放系统资源,关闭前会刷新缓冲区。流已经关闭就不能再使用
public class Demo04 {
    public static void main(String[] args) throws IOException {
        //创建字符输出流
        FileWriter fw = new FileWriter("day10\\4.txt");
        //调用write,把数据写入内存缓冲区
        fw.write(65);
        //调用flush,把内存缓冲区中的数据刷新到文件中
        fw.flush();
        //flush之后流可以继续使用
        fw.write(66);
        //调用close方法
        fw.close();
        //close之后流被释放,不能继续使用
        //fw.write(67);//java.io.IOException: Stream closed

    }
}

字符输出流中其他写数据的方法

  • public void write(char[] cbuf) :将 b.length字符从指定的字符数组写出此输出流。
  • public abstract void write(char[] b, int off, int len) :从指定的字符数组写出 len字符,从偏移量 off开始输出到此输出流。
  • public void write(String str) :写出一个字符串。
  • public void write​(String str, int off, int len): 写一个字符串的一部分。
public class Demo05 {
    public static void main(String[] args) throws IOException {
        //创建字符输出流
        FileWriter fw = new FileWriter("day10\\5.txt");
        //调用write方法,把数据写入内存缓冲区

        //public void write(char[] cbuf)
        char[] chars = {'a','b','1','#','中'};
        fw.write(chars);//ab1#中

        //public abstract void write(char[] b, int off, int len)
        fw.write(chars,2,2);//1#

        //public void write(String str) :写出一个字符串。
        fw.write("你好");//你好

        //public void write​(String str, int off, int len)
        fw.write("123456",2,3);//345


        //释放资源
        fw.close();
    }
}

追加写和换行

追加写:使用两个参数的构造方法

  • FileWriter​(File file, boolean append)
  • FileWriter​(String fileName, boolean append)
    参数:
    File file,String fileName:写入数据的目的地
    boolean append:追加写开关
    - true:不会覆盖原文件,追加写
    - false:创建新文件,覆盖原文件

换行:使用换行符号
windows:\r\n
linux:/n
mac:/r

示例:追加写和换行

public class Demo01 {
    public static void main(String[] args) throws IOException {
        FileWriter fw = new FileWriter("day10\\6.txt",true);
        for (int i = 0; i < 10; i++) {
            fw.write("hello"+i+"\r\n");
        }
        //释放资源
        fw.close();
    }
}

你可能感兴趣的:(JavaEE学习日志)