图文精讲(四)——Java I/O流——字符流(概述、读写文件、文件的拷贝、缓冲区、缓冲流)

字符流概述:

说明:
除了字节流,JDK还提供了用于实现字符操作的字符流,同字节流一样,字符流也有两个抽象的顶级父类,分别是Reader和Writer。

Reader和Write继承体系:
图文精讲(四)——Java I/O流——字符流(概述、读写文件、文件的拷贝、缓冲区、缓冲流)_第1张图片

字符流操作文件:

说明:
想从文件中直接读取字符便可以使用字符输入流FileReader,通过此流可以从文件中读取一个或一组字符。
示例(逐个字符读取文件):

    FileReader fileReader = new FileReader("reader.txt");
    int len = 0;
    while ((len = fileReader.read()) != -1) {
          System.out.print((char)len);
    }
    fileReader.close();

说明:
要向文件中写入字符就需要使用FileWriter类,该类是Writer的一个子类

示例(逐个字符写入文件):

    FileWriter fileWriter = new FileWriter("writer.txt");
    fileWriter.write("轻轻的我走了,\r\n");
    fileWriter.write("正如我轻轻的来;\r\n");
    fileWriter.write("我轻轻的招手,\r\n");
    fileWriter.write("作别西天的云彩。\r\n");
    fileWriter.close();

同理:
使用字符流向文件追加写入数据,需要调用重载的构造方法。

    FileWriter fileWriter = new FileWriter("writer.txt",true);

字符缓冲区缓冲流:
说明:
使用字符流逐个字符的读写文件也需要频繁的操作文件,效率仍非常低。为此,同字节流操作文件一样,也可以使用提供的字符流缓冲区(类似于字节流缓冲区)和字符缓冲流(类似于字节缓冲流)进行读写操作,来提高执行效率。

使用:
字符流缓冲区需要定义一个字符数组作为字符缓冲区,通过操作字符缓冲区来提高文件读写效率。
字符缓冲流需要使用BufferedReader和BufferedWriter,其中BufferedReader用于对字符输入流进行操作,BufferedWriter用于对字符输出流进行操作。在BufferedReader中有一个readLine()方法,用于一次读取一行文本。

示例(使用字符流缓冲区拷贝文件):

    FileReader fileReader = new FileReader("reader.txt");
    FileWriter fileWriter = new FileWriter("writer.txt");
    int len = 0;
    char[] buff = new char[1024];
    while ((len = fileReader.read(buff)) != -1) {
          fileWriter.write(buff, 0, len);
    }
    fileReader.close();
    fileWriter.close();

示例(使用字符缓冲流拷贝文件):

BufferedReader br = new BufferedReader(new FileReader("reader.txt "));
BufferedWriter bw = new BufferedWriter(new FileWriter("writer.txt"));
String str = null;
while ((str = br.readLine()) != null) {
      bw.write(str);
      bw.newLine();
}
br.close();
bw.close();

转换流:

说明:
在JDK中,提供了两个类用于实现将字节流转换为字符流,它们分别是InputStreamReader和OutputStreamWriter。
InputStreamReader是Reader的子类,它可以将一个字节输入流转换成字符输入流=,方便直接读取字符。
OutputStreamWriter是Writer的子类,它可以将一个字节输出流转换成字符输出流,方便直接写入字符。
转换流操作文件示意图:
在这里插入图片描述

文件的拷贝源码:

字符流普通拷贝:

package liu;

import java.io.FileReader;
import java.io.FileWriter;
import java.io.IOException;

public class ZiFuLiuDomo {
  public static void main(String[] args) throws IOException {
   FileReader fd = new FileReader("c:\\javas\\b.txt");
   FileWriter fw = new FileWriter("c:\\javas\\kk\\b.txt");
   int ch;
   while((ch=fd.read())!=-1){//方法一,一个一个的读
    fw.write((char)ch);
    fw.flush();
   }
//   int len;
//   char []c = new char[1024];
//   while ((len = fd.read(c)) != -1) {//方法二,以数组的形式进行读
//            fw.write(c, 0, len);
//            fw.flush();//刷新
//      }
      fd.close();
      fw.close();
  }
}

字符流缓冲流拷贝:

package liu;

import java.io.*;

public class ZiFuHuanCongLiu {
  public static void main(String[] args) throws IOException {
    BufferedReader br = new BufferedReader(new FileReader("c:\\javas\\b.txt"));
       BufferedWriter bw = new BufferedWriter(new FileWriter("c:\\javas\\kk\\wo.txt"));
       String str = null;
       while ((str = br.readLine()) != null) {
             bw.write(str);
             bw.newLine();
       }
       br.close();
       bw.close();
  }
}

你可能感兴趣的:(Java2020上)