Java IO流--Reader流(字符输入流) & Writer流(字符输出流)

Posted Z && Y

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Java IO流--Reader流(字符输入流) & Writer流(字符输出流)相关的知识,希望对你有一定的参考价值。

InputStream(字节输入流) & OutputStream(字节输出流)

1. Reader流

  • Reader : 和InputStream的唯一的区别就在于读的数据单位不同

  • 继承自Reader的流都是用于向程序中输入数据,且数据的单位为字符(16bit)

  • 16位:一个字符也就是两个字节,使用Reader流读取数据时都是两个字节两个字节往外读的,为什么还要有这两种两个字节的读取方式呢? 因为有些字符是占2个字节的,如我们的中文字符在Java里面就是占两个字节的。如果采用一个字节一个字节往外读的方式,那么读出来的就是半个汉字,这样子Java就没有办法正确的显示中文字符的,所以有必要存在这种流,一个字符一个字符地往外读。

Reader的基本方法:

//读取一个字节并以整数的形式返回(0~255) 
//如果返回-1就说明已经到了输入流的末尾 
int read() throws IOException 

//读取一系列字节并存储到一个数组buffer
//返回实际读取的字节数,如果读取前已到输入流的末尾,则返回-1 
int read(byte[] buffer) throws IOException

//从offset位置开始,读取length个字节 并存储到一个字节数组buffer, 
//返回实际读取的字节数,如果读取前以到输入流的末尾返回-1.
int read(byte[] buffer,int offset,int length) throws IOException

//关闭流释放内存资源 
void close() throws IOException

//跳过n个字节不读,返回实际跳过的字节数 
long skip(long n) throws IOException

2. Writer流

继承自Writer的流都是用于程序中输出数据,且数据的单位为字符(16bit);

Writer的基本方法:

//向输出流中写入一个字节数据,该字节数据为参数b的低16位 
void write(int b) throws IOException

//将一个字节类型的数组中的数据写入输出流 
void write(byte[] b) throws IOException

//将一个字节类型的数组中的从指定位置(off)开始的len个字节写入到输出流 
void write(byte[] b,int off,int len) throws IOException

//关闭流释放内存资源 
void close() throws IOException

//将输出流中缓冲的数据全部写出到目的地 
void flush() throws IOException

【演示:使用FileWriter(字符流)向指定文件中写入数据】:

read.txt

Hello Java!
Hello C!
Hello Python!
Hello C#!

write.txt

Test.java

package character1;

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

/*使用FileWriter(字符流)向指定文件中写入数据写入数据时以1个字符为单位进行写入*/
public class Test {
    public static void main(String[] args) {
        /*使用FileWriter输出流从程序把数据写入到write.txt文件中
        使用FileWriter流向文件写入数据时是一个字符一个字符写入的*/
        try (FileWriter fileWriter = new FileWriter("E:\\\\IDEACode\\\\ketangpai\\\\file-test\\\\src\\\\character1\\\\resource\\\\write.txt");
             FileReader fileReader = new FileReader("E:\\\\IDEACode\\\\ketangpai\\\\file-test\\\\src\\\\character1\\\\resource\\\\read.txt");) {
            /*
             字符的本质是一个无符号的16位整数 
             字符在计算机内部占用2个字节 
             这里使用for循环把0~60000里面的所有整数都输出 
             这里相当于是把全世界各个国家的文字都以0~60000内的整数的形式来表示
             */
            for (int i = 0; i < 60000; i++) {
                /*
                使用write(int c)把0~60000内的整数写入到指定文件内
                调用write()方法时,我认为在执行的过程中应该使用了“(char)c”进行强制 转换,
                即把整数转换成字符来显示
                因为打开写入数据的文件可以看到,里面显示的数据并不是0~60000内的整数,
                而是不同国家的文字的表示方式
                 */
                fileWriter.write(i);
            }
            /*使用FileReader(字符流)读取指定文件里面的内容 读取内容时是以一个字符为单位进行读取的*/
            int b = 0;
            long num = 0;
            while ((b = fileReader.read()) != -1) {
                System.out.print((char) b);
                num++;
            }
            System.out.println();
            System.out.println("总共读取了" + num + "个字符");
        } catch (Exception e) {
//            打印异常信息
            e.printStackTrace();
//            异常退出
            System.exit(-1);
        }
    }
}


3. 小结

  • FileReader和FileWriter这两个流都是字符流,都是以一个字符为单位进行输入和输出的。所以读取和写入占用2个字节的字符时都可以正常地显示出来,以上是以File(文件)这个类型为例对节点流进行了讲解,所谓的节点流指定就是直接把输入流或输出插入到数据源上,直接往数据源里面写入数据或读取数据。


以上是关于Java IO流--Reader流(字符输入流) & Writer流(字符输出流)的主要内容,如果未能解决你的问题,请参考以下文章

java IO流学习总结

java io流 教程

Java IO_003.Reader与Writer--字符流以及编码对数据的操作(读取与写入)

javaio流之字符输入流:java.io.Reader类及子类的子类java.io.FileReader

字符输入流

字符输入流