前言:

中文和英文在字符编码上存在一定性的差异,因为最开始使用的 ASCII编码表 的 256 个字符并没有支持中文,中文编码系统大多数采用的是 GBK 和 UTF-8 。

在 GBK 编码表中,一个中文字符占用两个字节,UTF-8 中占用了 3 个字节,如果我们采用字节读写的方式读写中文字符就会出现中文编程乱码的情况, 我们都知道 Java 这么风靡很大部分还是因为他的跨平台性,但如果连语言都没有搞定那还怎么牛逼起来,所以 java 为了避免这种情况引进了字符的读写操作。

IO字符流_码表

 

 

 

 

字节流读写针对的是一个字节,而在字符流读写中,他的对象并不再是一个单字节。

1.字符输入流Writer

Writer 是一个用于写入字符流的 「抽象类」。子类必须实现的方法仅有 write(char[], int, int)、flush() 和 close()

它是所有字符输出流的父类。

writer常用方法

void write(int c);//写入一个字符

void write(char[] cbuf);//写入一个字符数组

void write(String str);//写入字符串

void write(char[] cbuf, int off, int len);//写入字符数组的一部分,从off索引开始,写入len个字符

void flush()//刷新该缓冲流,即 ,将使用的Wrtier流写入到本地文件中,而不是存于内存中

void close()  //关闭流,并且释放资源,但必须先刷新流     

(一)   

    OutputStreamWriter writer=new OutputStreamWriter(new FileOutputStream("e:\\a.txt"),"gbk");
    
    writer.write(100);
    writer.write("你好");
    char[] a= {'a','b','c','d','e'};
    writer.write(a);
    writer.write(a, 0, 2);
    writer.flush();
    writer.close();

(二)

FileWriter fw=new FileWriter("e:\\a.txt");
    fw.write(100);
    char[] cfw={'a','b','c','d','e'};
    fw.write(cfw);
    fw.write("你好");
    fw.write(cfw, 0, 2);
    fw.flush();
    fw.close();

 

2.字符输入流Reader

「Reader」是一个用于读取字符流的「抽象类」。子类必须实现的方法只有 read(char[], int, int) 和 close()。

它是所有字符输入流的父类。

以下是 Reader 类中常用的几个方法:

int read()//读取单个字符。 

int read(char[] cbuf)//将字符读入数组。 

int read(char[] cbuf, int off, int len//将字符读入数组的某一部分。 

 

(一

InputStreamReader reader=new InputStreamReader(new FileInputStream("e:\\tiku.txt"),"gbk");
    int cr=0;
     while((cr=reader.read())!=-1) {
         System.out.println((char)cr);
     }
    char[] cbuf=new char[1024];
    int cr=0;
    while((cr=reader.read(cbuf))!=-1) {
        System.out.println(new String(cbuf));
    }
    reader.close();

 

(二)

FileReader fr=new FileReader("e:\\tiku.txt");
    char[] cbuf=new char[1024];
    int cr=0;
    while((cr=fr.read(cbuf))!=-1) {
        System.out.println(new String(cbuf));
        
    }
    fr.close();

3.缓冲字符输入输出流

(一)

  BufferedWriter writer=new BufferedWriter(new OutputStreamWriter(new FileOutputStream("e:\\a.txt"),"gbk"));
//      char[] cbuf= {'f','g','h','j','k'};
//     writer.write(cbuf);
//     writer.newLine();
//    writer.write("你好");
//     writer.flush();
//     writer.close();
     
//     BufferedReader reader=new BufferedReader(new InputStreamReader(new FileInputStream("e:\\tiku.txt"),"gbk"));
//     char[] cbuf=new char[1024];
//     int cr=0;
//     while((cr=reader.read(cbuf))!=-1) {
//         System.out.println(new String(cbuf));
//     }
//         reader.close();

(二)

BufferedWriter writer=new BufferedWriter(new FileWriter("e:\\a.txt"));
    char[] cbuf= {'f','g','h','j','k'};
    writer.write(cbuf);
    writer.newLine();
    writer.write("你好");
    writer.flush();
    writer.close();
    BufferedReader reader=new BufferedReader(new FileReader("e:\\tiku.txt"));
    char[] cbur=new char[1024];
    int cr=0;
    while((cr=reader.read(cbur))!=-1) {
        System.out.println(new String(cbur));
    }