1.基本介绍621
1.节点流可以从特定的数据源读写数据,如Filereader、FileWriter[源码]
2.处理流(又称包装流)是在现有流(节点流或处理流)上“连接”,为程序提供更强大的读写功能,更灵活,如bufferedreader、BufferedWriter[源码]
2.节点流和处理流的列表621 3.节点流与处理流的区别与联系6221.节点流是直接与数据源连接的底层流/低级流。
2.处理流(包装流)包装节点流不仅可以消除不同节点流的差异,还可以提供更方便的方法来完成输入和输出。[源代码理解]
3.处理流(也称为包装流)包装节点流,使用装饰设计模式,不会直接连接到数据源[模拟装饰设计模式=”合作伙伴会非常清楚.]
3.1com模拟处理流代码.stulzl.reader_.在包中测试Test__
package com.stulzl.reader_;///模拟处理流/包装流 622public class Test_ { public static void main(String[] args) { BufferedReader_ bufferedReader_ = new BufferedReader_(new FileReader_()); bufferedReader_.readFiles(10); bufferedReader_.readFile(); ///希望这次通过 BufferedReader_ 多次读取字符串 BufferedReader_ bufferedReader_1 = new BufferedReader_(new StringReader_()); bufferedReader_1.readStrings(5); }}
抽象父类Reader_
package com.stulzl.reader_;public abstract class Reader_ {//抽象类 //定义两种方法 public void readFile() {}; public void readString(){};}
子类Buferedreader_
package com.stulzl.reader_;///模拟处理流/包装流 622public class BufferedReader_ extends Reader_{//视为包装流 private Reader_ reader_;////直接定义抽象Reader_类型的属性 //构造器,根据传输的对象参数,动态绑定相应类的方法 ///涉及多态和动态绑定 public BufferedReader_(Reader_ reader_) {//可以接收Reader_子类对象 this.reader_ = reader_; } ///调用底层(子类)readFile()方法 public void readFile() { ///包装一层 reader_.readFile(); } //提供方法 使方法更加灵活,多次阅读文件 public void readFiles(int num){ //循环调用方法 for (int i = 0; i < num; i++) { //因为reader_是抽象的,其他类别继承并实现了方法,所以可以调用 ///涉及多态和动态绑定 reader_.readFile();///调用Reader_readFile() } } //扩展 readString, 字符串数据的批量处理 public void readStrings(int num) { for(int i = 0; i <num; i++) { reader_.readString(); } }}
子类Filereader
package com.stulzl.reader_;public class FileReader_ extends Reader_{//视为节点流 ///实现抽象类中的方法 public void readFile(){ System.out.println("操作文件.."; }}
子类Stringreader
package com.stulzl.reader_;public class StringReader_ extends Reader_{//视为节点流 ///实现抽象类中的方法 public void readString(){ System.out.println(“读字符串…”; }}
4.处理流的功能主要体现在以下两个方面:623
1.性能提高:输入输出效率主要是通过增加缓冲来提高的。
2.操作方便:处理流可以提供一系列方便的方法一次输入输出大量数据,使用更加灵活方便
5.处理流Bufferedreader和bufferedwriter623➢bufferedreader和bufferedwriter属于字符流,按字符读取数据
➢关闭时处理流,只需关闭外层流即可
5.1案例演示Buferedreader623使用bufferedreader阅读文本文件并显示在控制台上
com中的代码.stulzl.bufferedreader_.包中BufferedReader_
package com.stulzl.bufferedreader_;import java.io.BufferedReader;import java.io.FileNotFoundException;import java.io.FileReader;///演示Bufferedreader的使用 623//使用bufferedreader阅读文本文件,控制台public显示 class BufferedReader_ { public static void main(String[] args) throws Exception { String filePath = "e:\\story.txt"; BufferedReader bufferedReader = new BufferedReader(new FileReader(filePath)); //读取 String line;////用于接收readLine()的返回值 //说明 //1. bufferedReader.readLine() 是按行读取文件 //2. 当返回 null 时,读完表示文件 while((line = bufferedReader.readLine())!=null){ System.out.println(line); } //关闭流 请注意///这里只需关闭 BufferedReader ,底层会自动关闭,因为底层会自动关闭 节点流 bufferedReader.close(); }}
5.2案例演示BufferedWriter624
使用BufferedWriter将”hello,世界中国”写在文件中
com中的代码.stulzl.bufferedwriter_.包中BufferedWriter_
package com.stulzl.bufferedwriter_;import java.io.BufferedWriter;import java.io.FileWriter;import java.io.IOException;///案例演示BufferedWriteriter 624//使用BuferedWriteriter 将”hello,“世界中国”,在文件中写入public class BufferedWriter_ { public static void main(String[] args) throws IOException { String filePath = "e:\\ok.txt"; ///创建BufferedWriter对象 //说明: //1. new FileWriter(filePath, true) 表示以追加的方式写入 //2. new FileWriter(filePath) , 表示以覆盖的形式写入 ///覆盖方式 BufferedWriter bufferedWriter = new BufferedWriter(new FileWriter(filePath)); ///添加方式 //BufferedWriter bufferedWriter = new BufferedWriter(new FileWriter(filePath,true)); bufferedWriter.write("hello,世界中国”);///写字符串 bufferedWriter.newLine();///插入与系统相关的换行符 bufferedWriter.write(hello2,世界中国”); bufferedWriter.newLine(); bufferedWriter.write(hello3,世界中国”); bufferedWriter.newLine(); //关闭流 bufferedWriter.close(); }}
5.3bufferedreader和bufferedwriter结合完成复制案例6255com中的代码.stulzl.buffered_copy.包中BufferedCopy_
package com.stulzl.buffered_copy;import java.io.*;//BufferedReader 和 结合BufferedWriter 拷贝案例 625public class BufferedCopy_ { public static void main(String[] args) { ///老韩说明 //1. BufferedReader 和 BufferedWriter 是安照字符操作 //2. 不要去操作 二进制文件[声音,视频,doc, pdf ], 文件损坏可能是可能的 String srcFilePath = "e:\\story.txt"; String destFilePath = "e:\story2.txt"; BufferedReader bufferedReader = null; BufferedWriter bufferedWriter = null; String line; try { bufferedReader = new BufferedReader(new FileReader(srcFilePath)); bufferedWriter = new BufferedWriter(new FileWriter(destFilePath)); //读取 while((line=bufferedReader.readLine())!=null){ ///每读一行写一行 bufferedWriter.write(line); //换行 bufferedWriter.newLine(); } System.out.println(“复制完…”; } catch (IOException e) { e.printStackTrace(); } finally { //关闭流 try { if(bufferedReader!=null){ bufferedReader.close(); } if(bufferedWriter!=null){ bufferedWriter.close(); } } catch (IOException e) { e.printStackTrace(); } } }}