BufferedReader_字符缓冲输入流与练习_对文本的内容进行排序
BufferedReader_字符缓冲输入流
一、BufferedReader类概念
API文档描述:
BufferedReader类从字符输入流中读取文本并缓冲字符,以便有效地读取字符,数组和行
可以通过构造函数指定缓冲区大小也可以使用默认大小。对于大多数用途,默认值足够大
由Reader构成的每个读取请求都会导致相应的读取请求由基础字符或字节流构成,建议通过BufferedReader包装Reader的实例类以提高效率如
BufferedReader in = new BufferedReader(new FileReader(“foo.in”));
使用DataInputStreams进行文本输入的程序可以通过用适当的BufferedReader替换每个DataInputStream来进行本地化
1)从字符输入流中读取文本并缓冲字符,以便有效地读取字符,数组和行怎么理解?
说明该类存在缓冲字符数组并且是该类可以高效读取字符的关键
2)构造函数指定缓冲区大小也可以使用默认大小怎么理解?
意味着该类存在的构造方法既可以传递数值指定缓冲区大小也可以由类中的默认大小指定
3)由Reader构成的每个读取请求都会导致相应的读取请求由基础字符或字节流构成,建议通过BufferedReader包装Reader的实例类以提高效率?
Reader构成的对象是字符对象,每次的读取请求都会涉及到字节读取解码字符的过程,而BufferedReader类中有设计减少这样的解码次数的方法,进而提高转换效率
4)BufferedReader替代DataInputStreams进行本地化?
需要查看DataInputStreams源码后才可知
package DemoThreadPool; import java.io.*; /* java.io.BufferedReader extends Reader继承自父类的共性成员方法: int read()读取单个字符并返回。 int read( char[ ] cbuf)一次读取多个字符,将字符读入数组。void close()关团该流并释放与之关联的所有资源。 构造方法: BufferedReader(Reader in)创建一个使用黑认大小输入缓冲区的缓冲字符输入流。BufferedReader ( Reader in,int sz) 创建一个使用指定大小输入缓冲区的缓冲字符输入流。 参数: Reader in :字符输入流 我们可以传递FileReader ,缓冲流会给FileReader增加一个缓冲区,提高FiLeReader的读取效率 特有的成员方法: string readline()读取一个文本行。读取一行数据 行的终止符号:通过下列字符之一即可认为某行已终止:换行('\n ')、回车('\r')或回车后直接跟着换行(\r\ln)。返回值: 包含该行内容的字符串,不包含任何行终止符,如果已到达流末尾,则返回null 使用步骤: 1.创建字符缓冲输入流对象,构造方法中传递字符输入流 2.使用字符缓冲输入流对象中的方法read/readLine读取文本 3.释放资源 */ public class Demo04BufferedReader { public static void main(String[] args) throws IOException { //1.创建字符缓冲输入流对象,构造方法中传递字符输入流 BufferedReader bufferedReader = new BufferedReader(new FileReader("a.txt")); //2.使用字符缓冲输入流对象中的方法read/readLine读取文本 /* String s1 = bufferedReader.readLine(); System.out.println(s1); String s2 = bufferedReader.readLine(); System.out.println(s2); String s3 = bufferedReader.readLine(); System.out.println(s3); 发下以上读取是一个重复的过程,所以可以使用循环优化不知道文件中有多少行数据,所以使用whiLe循环 whiLe的结束条件,读取到null结束 */ String line; while ((line = bufferedReader.readLine())!=null){ System.out.println(line); } //3.释放资源 bufferedReader.close(); } }
练习_对文本的内容进行排序
对文本的内容进行排序 按照(1,2,3....)顺序 文本《出师表》: 3.侍中、侍郎郭攸之、费祎、董允等,此皆良实,志虑忠纯,是以先帝简拔以遗陛下。愚以为宫中之事,事无大小,悉以咨之, 然后施行,必得裨补阙漏,有所广益。 8.愿陛下托臣以讨贼兴复之效,不效,则治臣之罪,以告先帝之灵。若无兴德之言,则责攸之、祎、允等之慢,以彰其咎;陛下 亦宜自谋,以咨诹善道,察纳雅言,深追先帝遗诏,臣不胜受恩感激。 4.将军向宠,性行淑均,晓畅军事,试用之于昔日,先帝称之曰能,是以众议举宠为督。愚以为营中之事,悉以咨之,必能使行 阵和睦,优劣得所。 2.宫中府中,俱为一体,陟罚臧否,不宜异同。若有作奸犯科及为忠善者,宜付有司论其刑赏,以昭陛下平明之理,不宜偏私, 使内外异法也。 1.先帝创业未半而中道崩殂,今天下三分,益州疲弊,此诚危急存亡之秋也。然侍卫之臣不懈于内,忠志之士忘身于外者,盖追 先帝之殊遇,欲报之于陛下也。诚宜开张圣听,以光先帝遗德,恢弘志士之气,不宜妄自菲薄,引喻失义,以塞忠谏之路也。 9.今当远离,临表涕零,不知所言。 6.臣本布衣,躬耕于南阳,苟全性命于乱世,不求闻达于诸侯。先帝不以臣卑鄙,猥自枉屈,三顾臣于草庐之中,咨臣以当世之 事,由是感激,遂许先帝以驱驰。后值倾覆,受任于败军之际,奉命于危难之间,尔来二十有一年矣。 7.先帝知臣谨慎,故临崩寄臣以大事也。受命以来,夙夜忧叹,恐付托不效,以伤先帝之明,故五月渡泸,深入不毛。今南方已 定,兵甲已足,当奖率三军,北定中原,庶竭驽钝,攘除奸凶,兴复汉室,还于旧都。此臣所以报先帝而忠陛下之职分也。至于 斟酌损益,进尽忠言,则攸之、祎、允之任也。 5.亲贤臣,远小人,此先汉所以兴隆也;亲小人,远贤臣,此后汉所以倾颓也。先帝在时,每与臣论此事,未尝不叹息痛恨于 桓、灵也。侍中、尚书、长史、参军,此悉贞良死节之臣,愿陛下亲之信之,则汉室之隆,可计日而待也。
分析:
1.创建一个HashMap集合对象,可以:存储每行文本的序号(1,2,3,…);value:存储每行的文本
2.创建字符缓冲输入流对象,构造方法中绑定字符输入流
3.创建字符缓冲输出流对象,构造方法中绑定字符输出流
4.使用字符缓冲输入流中的方法readline,逐行读取文本
5.对读取到的文本进行切割,获取行中的序号和文本内容
6.把切割好的序号和文本的内容存储到HashMap集合中(key序号是有序的,会自动排序1,2,3,4…)
7.遍历HashMap集合,获取每一个键值对
8.把每一个键值对,拼接为一个文本行
9.把拼接好的文本,使用字符缓冲输出流中的方法write,写入到文件中
10.释放资源
package com.IOAndProperties.BufferedStream; import java.io.*; import java.util.*; /* 练习: 对文本的内容进行排序 按照{1,2,3....}顺序排序 分析: 1.创建一个HashMap集合对象,可以:存储每行文本的序号(1,2,3...);value:存储每行的文本 2.创建字符缓冲输入流对象,构造方法中绑定字符输入流 3.创建字符缓冲输出流对象,构造方法中绑定字符输入流 4.使用字符缓冲输入流中的方法readLine,逐行读取文本 5.对读取的文本进行切割,获取行中的序号和文本内容 6.把切割好的序号和文本内容存储到HashMap集合中(key序号是有序的,会自动排序1,2,3...) 7.遍历HashMap,获取每一个键值对 8.把每一个键值对拼接为一个文本行 9.把拼接好的文本,使用字符缓冲输出流中的方法write,写入到文本中 10.释放资源 */ public class Demo05Test { public static void main(String[] args) throws IOException { //1.创建一个HashMap集合对象,可以:存储每行文本的序号(1,2,3...);value:存储每行的文本 HashMap<String,String> map = new HashMap<>(); // 2.创建字符缓冲输入流对象,构造方法中绑定字符输入流 BufferedReader br = new BufferedReader(new FileReader("基础语法\\出师表.txt")); //3.创建字符缓冲输出流对象,构造方法中绑定字符输入流 BufferedWriter bw = new BufferedWriter(new FileWriter("基础语法\\出师表排序.txt")); //4.使用字符缓冲输入流中的方法readLine,逐行读取文本 String line ; while ((line=br.readLine())!=null){ // 5.对读取的文本进行切割,获取行中的序号和文本内容 String[] array = line.split("\\."); // 6.把切割好的序号和文本内容存储到HashMap集合中(key序号是有序的,会自动排序1,2,3...) map.put(array[0],array[1]); line = br.readLine(); } /* Set<String> set = map.keySet(); Iterator<String> it = set.iterator(); while (it.hasNext()){ String key = it.next(); Object value = map.get(key); System.out.println(key+"."+value); line = key+"."+value; bw.write(line); bw.newLine(); }*/ // 7.遍历HashMap,获取每一个键值对 for (String key : map.keySet()) { String value = map.get(key); //8.把每一个键值对拼接为一个文本行 line =key+"."+value; // 9.把拼接好的文本,使用字符缓冲输出流中的方法write,写入到文本中 bw.write(line); bw.newLine(); //输入每一行之后写换行 } //关闭资源 bw.close(); br.close(); } }