黑马程序员——IO流(字符流、包装设计模式)
2015-04-06 19:44
295 查看
-----------android培训、java培训、java学习型技术博客、期待与您交流!------------
IO流(BufferedWriter)
字符流的缓冲区:
对应类
BufferedWriter
BufferedReader
缓冲区要结合流才可以使用。
在流的基础上对流的功能进行了增强。
类BufferedWriter
将文本写入字符输出流,缓冲各个字符,从而提供单个字符、数组和字符串的高效写入。
缓冲区的出现是为了提高流的操作效率而出现的。
所以在创建缓冲区之前,必须要先有流对象。
特殊方法:
跨平台换行符。
void newLine() 写入一个行分隔符。
BufferedReader:
String readLine()
读取一个文本行。
返回:包含该行内容的字符串,不包含任何行终止符,如果已达到流末尾,则返回null。
练习:
通过缓冲区复制一个.java文件。
装饰设计模式:
当想要对已有的对象进行功能增强时,可以定义类,将已有对象传入,基于已有的功能,并提供加强功能。
那么自定义的该类称为装饰类。
例子:
装饰类通常会通过构造方法接收被装饰的对象。
并基于被装饰的对象的功能,提供更强的功能。
装饰和继承的区别:
MyReader//专门用于读取数据的对象。
|——MyTextReader
|——MyBufferTextReader
|——MyMediaReader
|——MyBufferMediaReader
|——MyDataReader
|——MyBufferDataReader
利用装饰设计模式进行优化:
class MyBufferReader extends Myreader
{
private MyReader mr;
MyBufferReader(MyReader mr)
{
this.mr = mr;
}
}
优化后的体系:
MyReader//专门用于读取数据的对象。
|——MyTextReader
|——MyMediaReader
|——MyDataReader
|——MyBufferDataReader
装饰模式比继承要灵活。避免了继承体系的臃肿。
而且降低了类与类之间的关系。
装饰类因为增强已有对象,具备的功能和已有的是相同的,只不过提供了更强的功能。
所以装饰类和被装饰类通常是都属于一个体系中。
练习:将myBufferedReader变成Reader的子类。
BufferReader的子类:
LineNumberReader 跟踪行号的缓冲字符输出流。 也是一个包装类。
其中含有两个方法:
setLineNumber和getLineNumber。设置行号和获取行号。
//练习:模拟一个带行号的缓冲区对象。
-----------android培训、java培训、java学习型技术博客、期待与您交流!------------
IO流(BufferedWriter)
字符流的缓冲区:
对应类
BufferedWriter
BufferedReader
缓冲区要结合流才可以使用。
在流的基础上对流的功能进行了增强。
类BufferedWriter
将文本写入字符输出流,缓冲各个字符,从而提供单个字符、数组和字符串的高效写入。
缓冲区的出现是为了提高流的操作效率而出现的。
所以在创建缓冲区之前,必须要先有流对象。
特殊方法:
跨平台换行符。
void newLine() 写入一个行分隔符。
BufferedReader:
String readLine()
读取一个文本行。
返回:包含该行内容的字符串,不包含任何行终止符,如果已达到流末尾,则返回null。
/* 字符读取流缓冲区: 该缓冲区提供了一个一次读一行的方法readLine,方便与对文本数据的获取。 当返回null时,表示读到文件末尾。 */ import java.io.BufferedReader; import java.io.FileReader; import java.io.IOException; public class BufferedReaderDemo { public static void main(String[] args) throws IOException { //创建一个读取流对象和文件相关联。 FileReader fr = new FileReader(".\\src\\BufferedReaderDemo.java"); //为了提高效率。加入缓冲技术。将字符读取流对象作为参数传递给缓冲对象的构造函数。 BufferedReader bufr = new BufferedReader(fr); String line = null; while((line=bufr.readLine())!=null) System.out.println(line); bufr.close(); } }
练习:
通过缓冲区复制一个.java文件。
import java.io.BufferedReader; import java.io.BufferedWriter; import java.io.FileNotFoundException; import java.io.FileReader; import java.io.FileWriter; import java.io.IOException; public class CopyTextByBuf { public static void main(String[] args) { FileReader fr =null; BufferedReader br=null; FileWriter fw = null; BufferedWriter bw=null; try { fr = new FileReader(".\\src\\CopyTextByBuf.java"); br = new BufferedReader(fr); fw = new FileWriter("CopyTextByBuf.java"); bw = new BufferedWriter(fw); String frstr ; while((frstr=br.readLine())!=null) { bw.write(frstr+System.lineSeparator());//bw.newLine(); bw.flush(); System.out.print(frstr+System.lineSeparator()); } } catch (IOException e) { throw new RuntimeException("读写失败"); } finally { try { if(br!=null) br.close(); } catch (IOException e) { throw new RuntimeException("读关闭失败"); } try { if(bw!=null) bw.close(); } catch (IOException e) { throw new RuntimeException("写关闭失败"); } } } } //readLine方法返回的时候只返回回车符之前的数据内容。并不返回回车符。 //readLine方法的原理 //无论是读一行,获取多个字符。其最终都是在硬盘上一个一个读取。 //所以最终使用的还是read方法,一次读一个的方法。 //明白了BufferedReader类中特有方法readLine的原理后, //可以自定义一个类中包含一个功能和readLine一致的方法。 //<strong>来模拟一下BufferedReader。</strong>
装饰设计模式:
当想要对已有的对象进行功能增强时,可以定义类,将已有对象传入,基于已有的功能,并提供加强功能。
那么自定义的该类称为装饰类。
例子:
class Person { public void chifan() { System.out.println("吃饭"); } } //增强吃饭功能 class SuperPerson { private Person p; SuperPerson(Person p) { this.p=p; } public void superChifan() { System.out.println("开胃酒"); p.chifan(); } } public class PersonDemo { public static void main(String[] args) { Person p = new Person(); SuperPerson sp = new SuperPerson(p); sp.superChifan(); } }
装饰类通常会通过构造方法接收被装饰的对象。
并基于被装饰的对象的功能,提供更强的功能。
装饰和继承的区别:
MyReader//专门用于读取数据的对象。
|——MyTextReader
|——MyBufferTextReader
|——MyMediaReader
|——MyBufferMediaReader
|——MyDataReader
|——MyBufferDataReader
利用装饰设计模式进行优化:
class MyBufferReader extends Myreader
{
private MyReader mr;
MyBufferReader(MyReader mr)
{
this.mr = mr;
}
}
优化后的体系:
MyReader//专门用于读取数据的对象。
|——MyTextReader
|——MyMediaReader
|——MyDataReader
|——MyBufferDataReader
装饰模式比继承要灵活。避免了继承体系的臃肿。
而且降低了类与类之间的关系。
装饰类因为增强已有对象,具备的功能和已有的是相同的,只不过提供了更强的功能。
所以装饰类和被装饰类通常是都属于一个体系中。
练习:将myBufferedReader变成Reader的子类。
BufferReader的子类:
LineNumberReader 跟踪行号的缓冲字符输出流。 也是一个包装类。
其中含有两个方法:
setLineNumber和getLineNumber。设置行号和获取行号。
//练习:模拟一个带行号的缓冲区对象。
import java.io.BufferedReader; import java.io.FileNotFoundException; import java.io.FileReader; import java.io.IOException; import java.io.Reader; class MyLineNumberReader extends BufferedReader { private int n ; public MyLineNumberReader(Reader in) { super(in); n=0; } public int getLine() { return n; } public void setLine(int n) { this.n = n; } public String readLine() throws IOException { n++; return super.readLine(); } } public class MyLineNumberReaderDemo { public static void main(String[] args) throws IOException { MyLineNumberReader mr = null; mr= new MyLineNumberReader(new FileReader(".\\src\\MyLineNumberReaderDemo.java")); String str = null; while((str = mr.readLine())!=null) { System.out.print(mr.getLine()+str+System.lineSeparator()); } mr.close(); } }
-----------android培训、java培训、java学习型技术博客、期待与您交流!------------
相关文章推荐
- 黑马程序员_基础_IO流学习笔记_文本文件读取及复制、字符流的缓冲区和装饰设计模式
- 黑马程序员_java的IO流(对第十九课字符缓冲区及装饰设计模式的总结)
- 黑马程序员--java 基础之IO流 字符流与装饰模式概述 --06
- 黑马程序员——Java基础——IO流、字符流、字节流、缓冲区技术、装饰设计模式、LineNumberReader等
- 黑马程序员——IO流-字符流&装饰设计模式
- 黑马程序员------IO流(No.1) (IO流概述、Reader、Writer、BufferedReader、BufferedWriter、装饰设模式)
- 54.黑马程序员-IO流-字符编码
- 黑马程序员_java入门_IO流_3(字符流缓冲区)
- 黑马程序员_IO流-装饰设计模式
- 黑马程序员—IO流(上)字符流、字节流
- 黑马程序员-JAVA基础-IO流中的装饰设计模式
- 黑马程序员__关于学习IO流字符流的缓冲区总结
- 黑马程序员_IO流——装饰设计模式
- 黑马程序员 java学习笔记3-IO流之字节流与装饰设计模式
- 黑马程序员_IO流1_(IO流概述,字符流,字节流,FileWriter,FileReader)
- 黑马程序员_IO流2_(字符缓冲区,字节缓冲区,字节字符转换流)
- 黑马程序员_IO流二(字符缓冲区,字节缓冲区,字节字符转换流)
- 黑马程序员_IO流-字符流的学习(二)
- 黑马程序员_IO流一(IO流概述,字符流,FileWriter,FileReader)
- 黑马程序员_IO流-字符流的学习(一)