欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

JAVA-----IO篇四(缓冲流BufferedWriter以及BufferedReader、转换流outputStreamWriter以及inputStreamWriter)

程序员文章站 2022-06-09 21:10:39
...

JAVA-----IO篇四(缓冲流BufferedWriter以及BufferedReader)

使用BufferedWriter、BufferedReader能够自带缓冲,不需要指定char或者byte数组。

BufferedReader

buffer流的构造方法与其他的流不同,传入的参数是Reader对象,有两个构造方法:

BufferedReader(Reader in): 创建一个使用默认大小输入缓冲区的缓冲字符输入流。
BufferedReader(Reader in,int sz):创建一个使用指定大小输入缓冲区的缓冲字符输入流。
但是通过阅读源码可知,Reader是一个抽象类,抽象类不能实例化对象。
但是它有子类,FileReader,FileReader的父类是inputStreamReader,而inputStreamReader的父类时Reader。
因此在构造对应的buffer流对象时,需要传入对应流对象。

注意引入两个新的概念:包装流(也称处理流)、节点流,二者区分是相对而言。创建BufferedReader对象时需要引入Reader对象。

如果一个流的构造方法中需要传入流,那么这传入流称为“节点流”,此处的reader就是节点流。
外部负责包装的流,称为:包装流,也可以叫做处理流,bufferedReader就是包装流。

 FileReader reader = new FileReader("F:\\a.txt");
 BufferedReader bufferedReader = new BufferedReader(reader);

对于IO对象其实学习一个输入流、一个输出流就能够理解其他的输入输出流。不用再详细学习。
这里BufferedReader有一个特殊的方法,讲一下就OK,readerLine()读一行。

/**
 * @author cz
 * @date 2020/6/18/018
 * 带有缓冲区的字符输入流
 * 使用这个流的时候,不需要自定义char数组,或者说不需要自定义byte数组。自带缓冲
 **/
public class BufferedReaderTest {
    public static void main(String[] args) throws IOException {
        String firstR = null;
        String secondR = null;
        // 如果一个流的构造方法中需要传入流,那么这传入流称为“节点流”,此处的reader就是节点流
//        外部负责包装的流,称为:包装流,也可以叫做处理流,bufferedReader就是包装流
        FileReader reader = new FileReader("F:\\a.txt");
        BufferedReader bufferedReader = new BufferedReader(reader);
//            firstR = bufferedReader.readLine();
//            secondR = bufferedReader.readLine();   // 当返回null时,证明该文件被读完
//        System.out.println(secondR);  //吼吼
//        System.out.println(firstR);  //哈哈哈黑黑 

       while ((firstR = bufferedReader.readLine())!=null){
           System.out.println(firstR);  
           //会读一个文本行,不带换行符,也就是说如果用print,就会输出在同一行.哈哈哈黑黑吼吼
       }
//        关闭流,只需要关闭最外层,里面的节点流不需要关闭,
//        在BufferedReader的源码中,能够发现,它的close方法,在关闭时,会自动关闭节点流对象。
//        对于包装流来说,只需要关闭外面的流即可,里面的节点流会自动关闭。
                bufferedReader.close();

    }
}

重点在buffer流,或者说是包装流的关闭,只需要关闭包装流即可,包装流的close方法会自动将节点流也关闭。以及buffer流的构造,还有使用时不需要指定byte或char数组。

根据构建方法中的Reader可知,buffer创建时只能够传入【字符流对象】,而不能传入【字节流对象】。
正好可以引入新的IO流对象学习:转换流outputStreamWriter、inputStreamWriter,作用就是将字节流转为字符流

转换流:outputStreamWriter、inputStreamWriter

/**
 * @author cz
 * @date 2020/6/18/018
 * 带有缓冲区的字符输入流
 * 使用这个流的时候,不需要自定义char数组,或者说不需要自定义byte数组。自带缓冲
 **/
public class BufferedReaderTest {
    public static void main(String[] args) throws IOException {
//        字节流
        FileInputStream in = new FileInputStream("F:\\a.txt");
        
//        该构造方法只能传递【字符流】,不能传递【字节流】
//        此时就需要转换流(将字节流转换为字符流) outputStreamWriter、inputStreamWriter
        InputStreamReader inputStreamReader = new InputStreamReader(in);
        
//        该构造方法只能传递【字符流】,不能传递【字节流】
        BufferedReader bufferedReader = new BufferedReader(inputStreamReader);

//        终极套娃,合并
//        BufferedReader bufferedReader = new BufferedReader(new InputStreamReader(new FileInputStream("F:\\a.txt")));

        String s = null;
        while ((s=bufferedReader.readLine())!=null){
            System.out.println(s);
        }
//        关闭时,关闭最外层
        bufferedReader.close();
    }
}

BufferedWriter

BufferedWriter和其他的输出流,在用法上没什么不同。同时也具有buffer流的特点。

/**
 * @author cz
 * @date 2020/6/18/018
 * 带有缓冲区的字符输入流、字符输出流、
 * 使用这个流的时候,不需要自定义char数组,或者说不需要自定义byte数组。自带缓冲
 **/
public class BufferReaderTest {
    public static void main(String[] args) throws IOException {

        BufferedWriter writer = new BufferedWriter(new FileWriter("F:\\a.txt",true));
//或者
//         BufferedWriter writer = new BufferedWriter(new OutputStreamWriter(new FileOutputStream("F:\\a.txt",true)));

        writer.write("hello");
        writer.write("\r\n");  //换行
        writer.write("world");
        writer.flush();
        writer.close();

    }
}

相关标签: IO java IO