详解 字符缓冲流

Posted codderyouzg

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了详解 字符缓冲流相关的知识,希望对你有一定的参考价值。

(请观看本人博文——《详解 字符流》

字符缓冲流 和 字节缓冲流(高效字节流)运用了同样的思想 —— 缓冲区思想
其实这种思想涉及到了Java的一种设计模式 —— 装饰模式
(对于此知识点,在此篇博文中不做讲解,将在本人后续博文中进行讲解)



字符缓冲流:

(高效字符转换流)

这两个类是利用缓冲区的思想,封装起来的BufferedWriter和BufferedReader

对于这两个类,本人要强调一下:
字符缓冲流特殊的API
对于要对文本文件内容一行一行进行处理的情况 最为适用。


那么,首先,本人来介绍下 输出流(BufferedWriter类):

BufferedWriter类:

首先,本人来展示下这个类的构造方法:

  • BufferedWriter(Writer out)
    创建一个使用默认大小(8192字节)的输出缓冲区的缓冲字符输出流
  • BufferedWriter(Writer out, int sz)
    创建一个使用给定大小的输出缓冲区的新缓冲字符输出流

现在,本人来展示下这个类的常用API

  • void write(char[] cbuf, int off, int len)
    写入字符数组的某一部分
  • void write(int c)
    写入单个字符
  • void write(String s, int off, int len)
    写入字符串的某一部分
  • void newLine()
    写入一个行分隔符
  • void flush()
    刷新该流的缓冲

现在,本人来展示下部分API的用法:

题:现在本人通过控制台向文件中录入粉丝姓名
要求:从控制台输入粉丝姓名(输入“exit”退出录入),录入后将之前所录入的粉丝姓名,逐行录入文件中。

package edu.youzg.about_io.about_file.core;

import java.io.*;
import java.util.ArrayList;
import java.util.Random;
import java.util.Scanner;

public class Test {

    public static void main(String[] args) throws IOException {
        ArrayList<String> list = new ArrayList<>();
        Scanner in = new Scanner(System.in);
        BufferedWriter writer = new BufferedWriter(new OutputStreamWriter(new FileOutputStream("fanName.txt")));

        System.out.println("-----------------------欢迎使用 粉丝姓名录入系统-----------------------");
        System.out.println("请输入粉丝姓名:");

        //从控制台向集合中录入粉丝姓名
        String fanName = null;
        while (!in.hasNext("exit")) {
            fanName = in.next();
            list.add(fanName);
            System.out.println("录入成功!请输入下一位粉丝姓名:(输入exit退出粉丝姓名录入系统)");
        }

        //读取一行数据,往集合里面添加一个
        String line = null;
        for (String s : list) {
            writer.write(s);
            writer.newLine();
            writer.flush();
        }

        //释放资源
        in.close();
        writer.close();
    }

}

现在,本人来展示下运行结果以及生成的文件的内容;
技术图片
那么,可以看到,本人的代码完成了要求!


现在,本人来介绍下 输入流(BufferedReader类):

BufferedReader类:

首先,本人来展示下这个类的构造方法:

  • BufferedReader(Reader in)
    创建一个使用默认大小(8192字节)的输入缓冲区的缓冲字符输入流
  • BufferedReader(Reader in, int sz)
    创建一个使用指定大小的输入缓冲区的缓冲字符输入流

现在,本人来展示下这个类的常用API

  • void mark(int readAheadLimit)
    标记流中的当前位置。
  • boolean markSupported()
    判断此流是否支持 mark() 操作(它一定支持)。
  • int read()
    读取单个字符。
  • int read(char[] cbuf, int off, int len)
    将字符读入数组的某一部分。
  • String readLine()
    读取一个文本行。
  • boolean ready()
    判断此流是否已准备好被读取。
  • void reset()
    将流重置到最新的标记。
  • long skip(long n)
    跳过字符。

那么,同样地,本人来展示下部分API的用法:

题:现在本人要随机从粉丝名称文件中抽取一个粉丝赠送礼品
要求:读取粉丝名称文件,然后从中随机输出一个粉丝名

package edu.youzg.about_io.about_file.core;

import java.io.*;
import java.util.ArrayList;
import java.util.Random;

public class Test {

    public static void main(String[] args) throws IOException {
        ArrayList<String> list = new ArrayList<>();
        BufferedReader reader = new BufferedReader(new InputStreamReader(new FileInputStream("fanName.txt")));
        //读取一行数据,往集合里面添加一个
        String line=null;
        while ((line=reader.readLine())!=null){
            list.add(line);
        }
        //随机从集合里面抽取一个粉丝
        Random random = new Random();
        int index = random.nextInt(list.size());
        String s = list.get(index);
        System.out.println(s);

        //释放资源
        reader.close();
    }

}

本人先来展示下源文件内容:
技术图片
现在,本人来展示下运行结果:
技术图片
可以看到,从粉丝信息文件中随机输出了一个粉丝的姓名


那么,现在,本人来展示下利用缓冲流来复制文件的操作:

package edu.youzg.about_io.about_file.core;

import java.io.*;

public class Test {

    public static void main(String[] args) throws IOException {
        BufferedReader bfr = new BufferedReader(new FileReader("fanName.txt"));
        BufferedWriter bfw = new BufferedWriter(new FileWriter("copyView.txt"));
        //读取一行,写出一行来复制
        String line = null;
        while ((line = bfr.readLine())!= null){
            bfw.write(line);
            bfw.newLine(); //写出一个换行符,具有平台兼容性
            bfw.flush();    //清空缓存区
        }
        
        //释放资源
        bfr.close();
        bfw.close();
    }

}

现在,本人来展示下运行后生成的文本文件的内容:
技术图片
可以看到,本人的代码完成了文件的复制功能!

(本人《详解 字节流 与 字符流》博文链接:https:////www.cnblogs.com/codderYouzg/p/12418532.html
(本人 I/O流总集篇 博文链接:https:////www.cnblogs.com/codderYouzg/p/12418404.html

以上是关于详解 字符缓冲流的主要内容,如果未能解决你的问题,请参考以下文章

Java I/O流详解与应用

java I/O流详解

IO基础之缓冲流的详解

10.6-全栈Java笔记:常见流详解

Java IO流详解——缓冲流

20179209《Linux内核原理与分析》第十二周作