详解 字符缓冲流
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)
以上是关于详解 字符缓冲流的主要内容,如果未能解决你的问题,请参考以下文章