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

为什么要使用字符流

当使用字节流读取文本文件时,可能会有一个小问题。就是遇到中文字符时,可能不会显示完整的字符,那是因为一个中文字符可能占用多个字节存储。所以Java提供一些字符流类,以字符为单位读写数据,专门用于处理文本文件。
 

Writer

Writer抽象类是表示用于写出字符流的所有类的超类,将指定的字符信息写出到目的地。它定义了字节输出流的基本共性功能方法。
  • void write(int c) 写入单个字符。
  • void write(char[] cbuf) 写入字符数组。
  • abstract void write(char[] cbuf, int off, int len) 写入字符数组的一部分,off表示数组的开始索引,len表示写的字符个数。
  • void write(String str) 写入字符串。
  • void write(String str, int off, int len) 写入字符串的某一部分,off表示字符串的开始索引,len写的字符个数。
  • void flush() 刷新该流的缓冲。
  • void close() 关闭此流,但要先刷新它。
 

1、FileWriter

FileWriter 类是写出字符到文件的便利类。构造时使用系统默认的字符编码和默认字节缓冲区。
构造方法
  • FileWriter(File file) : 创建一个新的 FileWriter,给定要读取的File对象象。
  • FileWriter(String fileName) : 创建一个新的 FileWriter,给定要读取的文件的名称。

Reader

Reader抽象类是表示用于读取字符流的所有类的超类,可以读取字符信息到内存中。它定义了字符输入流的基本共性功能方法。
  • public void close() :关闭此流并释放与此流相关联的任何系统资源。
  • public int read() : 从输入流读取一个字符。如果读取到最后返回-1
  • public int read(char[] cbuf) : 从输入流中读取一些字符,并将它们存储到字符数组 cbuf中 。返回的是读取的长度。如果读取到最后返回-1

2,FileReader

FileReader类是读取字符文件的便利类。构造时使用系统默认的字符编码和默认字节缓冲区。
构造方法
  • FileReader(File file) : 创建一个新的 FileReader ,给定要读取的File对象。
  • FileReader(String fileName) : 创建一个新的 FileReader ,给定要读取的文件的名称
Reader常用方法:
  • 1,读取单个字符 int read():每次可以读取一个字符的数据,提升为int类型,读取到文件末尾,返回 -1
  • 2,使用字符数组读取数据,int read(char[] cbuf) ,每次读取b的长度个字符到数组中,返回读取到的有效字符个数,读取到末尾时,返回 -1
 示例读写:写
import java.io.FileWriter;
import java.io.IOException;
import java.io.Writer;

/**
 * @ClassName WriterStringToFile
 * @projectName: object1
 * @author: Zhangmingda
 * @description: XXX
 * date: 2021/4/17.
 */
public class WriterStringToFile {
    public static void main(String[] args) throws IOException {
        String fileFath = "输入输出文件读写/src/test/output/writerOut.txt";
        Writer writer = new FileWriter(fileFath);
        writer.write(97);//写入字符编码
        writer.write('b'); //写入字符
        char[] chars = {'e','f'};
        writer.write(chars);
        String text = "剑门关-V哥
" +
                "北望剑阁一线天,
" +
                "遥想翼德战关前。
" +
                "纵使王朝风云变,
" +
                "雄关笑傲数千年。";
        writer.write(text);
//        writer.flush();
        writer.close();
    }
}

  示例读写:读

import java.io.FileReader;
import java.io.IOException;
import java.io.Reader;
/**
 * @ClassName ReaderStringFromFile
 * @projectName: object1
 * @author: Zhangmingda
 * @description: XXX
 * date: 2021/4/17.
 */
public class ReaderStringFromFile {
    public static void main(String[] args) throws IOException {
        String srcPath = "输入输出文件读写/src/test/output/writerOut.txt";
        Reader fileReader = new FileReader(srcPath);
        StringBuffer text = new StringBuffer();
        char[] characters = new char[1024];
        int length;
        while ((length = fileReader.read(characters)) != -1) {
//            System.out.println( characters);
            text.append(characters,0,length);
            System.out.println("读取到字符个数:" + length);
        }
        fileReader.close(); //关闭字符流
        System.out.println(text);
    }
}

原文地址:https://www.cnblogs.com/zhangmingda/p/14672155.html