带缓冲的字符流、转换流

本文简要介绍带缓冲的字符流BufferedReader、BufferedWrite和转换流InputStreamReader、OutputStreamWriter。

1.BufferedReader

带缓冲的字符输入流。继承Reader。

其构造方法中的参数是一个Reader,但是Reader是一个抽象类,所以要借助Reader的子类。

关闭流只需要关闭带缓冲的字符流,带缓冲的字符流的close()内部会自动调用其参数的流的close()。

带缓冲的字符流不需要再借助数组读取数据了,其自带缓冲。

它有一个特殊的方法readLine(),每次可以读取一行数据,返回值为String,当读到文件末尾时返回null。

使用:

package com.dh.io;

import java.io.BufferedReader;
import java.io.FileNotFoundException;
import java.io.FileReader;
import java.io.IOException;

public class BufferedReader01 {

    public static void main(String[] args) {

        //构造方法的参数需要一个Reader
        //但是Reader是一个抽象类,所以我们可以使用其子类FileReader
        FileReader fr = null;
        BufferedReader br = null;
        try {
            fr = new FileReader("IO\\Hello.java");
            br = new BufferedReader(fr);
            //带缓冲的字符流不再需要借助数组了,自带缓冲
            //具有一个特殊的方法,每次读取一行,当没有读取数据时,返回null
            String s1 = null;
            while((s1 = br.readLine()) != null){
                System.out.println(s1); //读取一行,不包括换行符
            }
        } catch (FileNotFoundException e) {
            e.printStackTrace();
        } catch (IOException e) {
            e.printStackTrace();
        } finally {
            //只需要关闭最外层的br
            //br调用close()时,br的close()内部会调用fr的close()
            if(br != null){
                try {
                    br.close();
                } catch (IOException e) {
                    e.printStackTrace();
                }
            }
        }

    }
}

2.包装流和节点流

当一个流的构造方法需要借助另外一个流实例化对象时,参数中的那个流称为节点流,构造对象的那个流称为包装流,也叫做处理流。

如:

FileReader fr = new FileReader("IO\\Hello.java");
BufferedReader br = new BufferedReader(fr);

fr:字节流;

br:包装流/处理流。

(包装流和节点流是相对的关系)

3.InputStreamReader

如果现在有一个字节流,但是参数需要的是一个字符流,我们就可以通过转换流,将字节流转换为字符流了。

InputStreamReader就可以将一个字节输入流转换为一个字符输入流。

package com.dh.io;

import java.io.*;

public class BufferedReader02 {
    public static void main(String[] args) {
        
        BufferedReader br = null;
        try {
            //字节输入流
            FileInputStream fis = new FileInputStream("IO\\Hello.java");
            //将字节输入流转换为字符输入流
            InputStreamReader reader = new InputStreamReader(fis);
            br = new BufferedReader(reader);
            
             //上述代码可写作一行
            //br = new BufferedReader(new InputStreamReader(new FileInputStream("IO\\Hello.java")));
            
            String s1 = null;
            while((s1 = br.readLine()) != null){
                System.out.println(s1); //读取一行,不包括换行符
            }
            
        } catch (FileNotFoundException e) {
            e.printStackTrace();
        } catch (IOException e) {
            e.printStackTrace();
        } finally {
            //只需要关闭最外层的br
            //br调用close()时,br的close()内部会调用fr的close()
            if(br != null){
                try {
                    br.close();
                } catch (IOException e) {
                    e.printStackTrace();
                }
            }
        }

    }
}

4.BufferedWriter

带缓冲的字符输出流。

package com.dh.io;

import java.io.*;

public class BufferedWriter01 {

    public static void main(String[] args) {

        BufferedWriter bw = null;
        try {
            FileOutputStream fos = new FileOutputStream("IO\\test.txt",true);
            OutputStreamWriter writer = new OutputStreamWriter(fos);
            bw = new BufferedWriter(writer);

            bw.write("hello world");
            bw.write("\n");
            bw.write("hello kitty");
            bw.write("\n");

            bw.flush();

        } catch (FileNotFoundException e) {
            e.printStackTrace();
        } catch (IOException e) {
            e.printStackTrace();
        }finally {
            if(bw != null){
                try {
                    bw.close();
                } catch (IOException e) {
                    e.printStackTrace();
                }
            }
        }
    }
}

4.OutputStreamWriter

把字节输出流转换为字符输出流。

FileOutputStream fos = new FileOutputStream("IO\\test.txt",true);
OutputStreamWriter writer = new OutputStreamWriter(fos);
BufferedWriter bw = new BufferedWriter(writer);

posted @ 2021-01-28 17:24  deng-hui  阅读(154)  评论(0编辑  收藏  举报