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

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)