目标:字符缓冲输入流的使用
结构:
字节流 | 字符流 | ||
字节输入流 | 字节输出流 | 字符输入流 | 字符输出流 |
InputStream | OutputStream | Reader | Writer(抽象类) |
FileInputStream | FileOutputStream | FileReader | FileWriter(实现类,低级流,原始流) |
BufferedInputStream | BufferedOutStream | BufferedReader | BufferedWriter(实现类,缓冲流) |
字符缓冲输入流:BufferedReader
– 作用:字符缓冲输入流可以把字符输入流包装成一个高级的缓冲字符输入流,
可以提高字符输入流读数据的性能。
– 构造器:public BufferedReader(Reader reader):
– 原理:缓冲字符输入流默认会有一个8K的字符缓冲池,可以提高读字符的性能。
– 缓冲字符输入流除了提高了字符输入流的读数据性能,还多了一个按照行读取数据的功能(重点)
public String readLine(): 读取一行数据返回,读取完毕返回null;
小结:
缓冲字符输入流提高了字符输入流读取文本文件内容的性能,同时
它还多了一个按照行读取内容的方法,建议使用。
public class BufferedReaderDemo01 {
public static void main(String[] args) throws Exception {
// 1.定义一个低级的字符输入流与源文件接通
Reader fr = new FileReader("src/dlei03.txt");
// 3.把低级的字符输入流包装成一个高级的缓冲字符输入流(经典代码)
BufferedReader br = new BufferedReader(fr);
// 定义一个字符串变量存储行数据
String line ;
while((line = br.readLine())!=null){
System.out.println(line);
}
// 2.定义一个字符数组读取文本内容
// char[] buffer = new char[1024];
// int len = 0 ;
// while((len = br.read(buffer)) != -1 ) {
// System.out.print(new String(buffer,0,len));
// }
}
}
字符缓冲输出流:BufferedWriter
– 作用:把字符输出流包装成一个高级的缓冲字符输出流,提高写字符数据的性能。
– 构造器:public BufferedWriter(Writer writer):
– 原理:高级的字符缓冲输出流多了一个8k的字符缓冲池,写数据性能极大提高了!
– 字符缓冲输出流除了提高字符输出流写数据的性,还多了一个换行的特有功能:
public void newLine():新建一行。
小结:
字符缓冲输出流除了提高字符输出流写数据的性,还多了一个换行的特有功能:
public void newLine():新建一行。
public class BufferedWriterDemo02 {
public static void main(String[] args) throws Exception {
// 1.定义一个低级的字符输出流通向目标文件。
Writer fw = new FileWriter("src/dlei04.txt");
// 3.把低级的字符输出流包装成一个高级的缓冲字符输出流。
BufferedWriter bw = new BufferedWriter(fw);
// 2.写数据出去
bw.write("我爱中国");
bw.newLine(); // 换行!
bw.write("黑马");
bw.close();
}
}
练习题
需求:把打乱的《出师表》的文章顺序进行恢复。
一.先帝创业未半而中道崩殂,今天下三分,益州疲弊,此诚危急存亡之秋也。然侍卫之臣不懈于内,忠志之士忘身于外者,盖追先帝之殊遇,欲报之于陛下也。诚宜开张圣听,以光先帝遗德,恢弘志士之气,不宜妄自菲薄,引喻失义,以塞忠谏之路也。二.宫中府中,俱为一体,陟罚臧否,不宜异同。若有作奸犯科及为忠善者,宜付有司论其刑赏,以昭陛下平明之理,不宜偏私,使内外异法也。三.侍中、侍郎郭攸之、费祎、董允等,此皆良实,志虑忠纯,是以先帝简拔以遗陛下。愚以为宫中之事,事无大小,悉以咨之,然后施行,必得裨补阙漏,有所广益。四.将军向宠,性行淑均,晓畅军事,试用之于昔日,先帝称之曰能,是以众议举宠为督。愚以为营中之事,悉以咨之,必能使行阵和睦,优劣得所。五.亲贤臣,远小人,此先汉所以兴隆也;亲小人,远贤臣,此后汉所以倾颓也。先帝在时,每与臣论此事,未尝不叹息痛恨于桓、灵也。侍中、尚书、长史、参军,此悉贞良死节之臣,愿陛下亲之信之,则汉室之隆,可计六.臣本布衣,躬耕于南阳,苟全性命于乱世,不求闻达于诸侯。先帝不以臣卑鄙,猥自枉屈,三顾臣于草庐之中,咨臣以当世之事,由是感激,遂许先帝以驱驰。后值倾覆,受任于败军之际,奉命于危难之间,尔来二十有一年矣。七.先帝知臣谨慎,故临崩寄臣以大事也。受命以来,夙夜忧叹,恐付托不效,以伤先帝之明,故五月渡泸,深入不毛。今南方已定,兵甲已足,当奖率三军,北定中原,庶竭驽钝,攘除奸凶,兴复汉室,还于旧都。此臣所以报先帝而忠陛下之职分也。至于斟酌损益,进尽忠言,则攸之、祎、允之任也。八.愿陛下托臣以讨贼兴复之效,不效,则治臣之罪,以告先帝之灵。若无兴德之言,则责攸之、祎、允等之慢,以彰其咎;陛下亦宜自谋,以咨诹善道,察纳雅言,深追先帝遗诏,臣不胜受恩感激。九.今当远离,临表涕零,不知所言。
分析:
(1)定义一个List集合存储文章的每段内容。
(2)开始定义一个缓冲字符输入流读取文章的每行内容,添加到List集合中。
(3)对List集合中的每个元素按照首字符排序。
(4)遍历List集合中的每个元素。
(5)定义一个缓冲字符输出流把每个元素写出去。
public class ExecDemo {
public static void main(String[] args) throws Exception {
// (1)定义一个List集合存储文章的每段内容。
List<String> datas = new ArrayList<>();
// (2)开始定义一个缓冲字符输入流读取文章的每行内容,添加到List集合中。
BufferedReader br = new BufferedReader(new FileReader("src/csb"));
// 开始循环按照行读取文章的每段内容
String line ;
while((line = br.readLine())!=null){
datas.add(line);
}
System.out.println(datas);
// 自定义大小比较规则。
List<String> cnSizes = new ArrayList<>();
Collections.addAll(cnSizes,"零","一","二","三","四","五","六","七","八","九","十");
// (3)对List集合中的每个元素按照首字符排序。
Collections.sort(datas, new Comparator<String>() {
@Override
public int compare(String o1, String o2) {
// o1 : 三,.....
// o2 : 七,.....
return cnSizes.indexOf(o1.charAt(0)+"") - cnSizes.indexOf(o2.charAt(0)+"");
}
});
System.out.println(datas);
// (5)定义一个缓冲字符输出流把每个元素写出去。
BufferedWriter bw = new BufferedWriter(new FileWriter("src/csb"));
// (4)遍历List集合中的每个元素。
for(String ln : datas){
bw.write(ln);
bw.newLine(); // 换行
}
br.close();
bw.close();
}
}