节点流和处理流

500 阅读2分钟

开启掘金成长之旅!这是我参与「掘金日新计划 · 12 月更文挑战」的第27天,点击查看活动详情

节点流和处理流

基本介绍

(1)节点流可以从一个特定的数据源读写数据,如FileReader,FileWriter。

(2)处理流(包装流)是“连接”在已存在的流(节点流或处理流之上),为程序提供更为强大的读写

功能,也更加灵活,如BufferedReader、BufferedWriter。

节点流和处理流的区别和联系

(1)节点流是底层流/低级流,直接跟数据源相接。

(2)处理流(包装流)包装节点流,既可以消除不同节点流的实现差异,也可以提供更方便的方法来

完成输入输出。

(3)处理流(包装流)对节点流进行包装,使用了修饰器设计模式,不会直接与数据源相连。

处理流的功能主要体现在以下两个方面

(1)性能的提高:主要以增加缓冲的方式来提高输入输出的效率。

(2)操作的便捷:处理流可以提供一系列便捷的方法来一次输入输入大量的数据,使用更加灵活方

便。

处理流BufferedReader和BufferedWriter

1)BufferedReader和BufferedWriter属于字符流,是按照字符来读取数据的

2)关闭处理流时,只需要关闭外层流即可

(1)使用BufferedReader读取文本文件,并显示在控制台

import java.io.BufferedReader;
import java.io.FileReader;

public class BufferedReader_ {
    public static void main(String[] args) throws Exception {
        String filePath = "e:\\a.java";
        //创建 bufferedReader
        BufferedReader bufferedReader = new BufferedReader(new FileReader(filePath));
        
        //读取
        String line; //按行读取, 效率高
        //说明
        //1. bufferedReader.readLine() 是按行读取文件
        //2. 当返回 null 时,表示文件读取完毕
        while ((line = bufferedReader.readLine()) != null) {
            System.out.println(line);
        }
        
        //关闭流, 这里注意,只需要关闭 BufferedReader ,因为底层会自动的去关闭 节点流
        //FileReader。
        /*
            public void close() throws IOException {
                synchronized (lock) {
                    if (in == null)
                        return;
                    try {
                        in.close();//in 就是我们传入的 new FileReader(filePath), 关闭了. 
                        } finally {
                            in = null;
                            cb = null;
                        }
                    }
                }
        */
        
        bufferedReader.close();
    }
}

(2)使用BufferedWriter将“Hello”,写入到文件中

import java.io.BufferedWriter;
import java.io.FileWriter;
import java.io.IOException;

public class BufferedWriter_ {
    public static void main(String[] args) throws IOException {
        String filePath = "e:\\ok.txt";
        
        //创建 BufferedWriter
        //说明:
        //1. new FileWriter(filePath, true) 表示以追加的方式写入
        //2. new FileWriter(filePath) , 表示以覆盖的方式写入
        
        BufferedWriter bufferedWriter = new BufferedWriter(new FileWriter(filePath));
        bufferedWriter.write("Hello");
        bufferedWriter.newLine();//插入一个和系统相关的换行
        bufferedWriter.write("Hello2");
        bufferedWriter.newLine();
        bufferedWriter.write("Hello3");
        bufferedWriter.newLine();
        //说明:关闭外层流即可 , 传入的 new FileWriter(filePath) ,会在底层关闭
        bufferedWriter.close();
    }
}

BufferedInputStream和BufferedOutputStream

BufferedInputStream是字节流,在创建BufferedInputStream时,会创建一个内部缓冲区数组。

BufferedOutputStream是字节流,实现缓冲的输出流,可以将多个字节写入底层输出流中,而不必对每

次字节写入调用底层系统。