java的设计模式——装饰模式
2016-07-24 17:21
531 查看
引例:
写一个MyBufferReader类,使它能够对字符流(如FileReader,InputStreamReader和PipedReader等)进行功能的增强:
(1)提供带缓冲的MyReader()方法对原来的read增速;
(2)提供每次读取一行字符的MyReaderLine()的方法。
分析:FileReader类里的int read()方法一次只能从数据库里面读出一个字符,传输速度相当的慢,我们在MyBufferReader类中一次从数据库中读出一个数组量的字符,然后从缓存里读取数据的速度就快多了。 就比如你家里要向学校交粮食,你每次从家里带一粒米交到学校和你每次打包或者带一车粮食到学校再一粒粒(学校只收一粒粒的米,就跟你的字符最后还是要一个个的读一样)地数给学校一样的差别,减少了与数据库的交互。
写一个MyBufferReader类,使它能够对字符流(如FileReader,InputStreamReader和PipedReader等)进行功能的增强:
(1)提供带缓冲的MyReader()方法对原来的read增速;
(2)提供每次读取一行字符的MyReaderLine()的方法。
分析:FileReader类里的int read()方法一次只能从数据库里面读出一个字符,传输速度相当的慢,我们在MyBufferReader类中一次从数据库中读出一个数组量的字符,然后从缓存里读取数据的速度就快多了。 就比如你家里要向学校交粮食,你每次从家里带一粒米交到学校和你每次打包或者带一车粮食到学校再一粒粒(学校只收一粒粒的米,就跟你的字符最后还是要一个个的读一样)地数给学校一样的差别,减少了与数据库的交互。
import java.io.FileReader; import java.io.IOException; import java.io.InputStreamReader; import java.io.Reader; public class MyBufferedReader extends Reader {//与封装(组合)不同的是它还继承了Reader,跟它成为了一个体系 private Reader r; private char[]cbuf = new char[1024]; private int count=0;//记录缓冲区中字符的个数 100 private int pos=0; public MyBufferedReader(Reader r){ this.r = r; } //功能增强1 public int myRead() throws IOException{ if(count<=0){ count = r.read(cbuf);//50 pos=0; } if(count==-1){ return -1; } count--;//每读一次,缓冲区中的还剩的字符数减1 char ch = cbuf[pos];//本次读的字符 pos++; return ch; } public void close() throws IOException { r.close(); } //换行: linux--\n window--\r\n public String myReadLine() throws IOException{ StringBuffer sb = new StringBuffer(); int ch=0; while( (ch=myRead())!=-1 ){ if(ch=='\r'){ continue; } if(ch=='\n'){ return sb.toString(); } sb.append( (char)ch );//字符连接 str = str+(char)ch; } if(sb.length()!=0){//文件的最后一行是没有换行符的 return sb.toString(); } return null; } @Override public int read(char[] cbuf, int off, int len) throws IOException { return r.read(cbuf, off, len); } }
<pre name="code" class="java"> //测试类 import java.io.BufferedReader; import java.io.FileInputStream; import java.io.FileNotFoundException; import java.io.FileReader; import java.io.IOException; import java.io.InputStreamReader; import org.junit.Test; public class TestMyBufferedreader { @Test//测试 public void jdk_testRead() throws IOException { FileReader r = new FileReader("a.txt"); BufferedReader br = new BufferedReader( r ); int ch=0; while( (ch=br.read())!=-1 ){ System.out.print((char)ch); } br.close(); } @Test public void my_testRead() throws IOException { InputStreamReader r = new InputStreamReader(new FileInputStream("a.txt")); MyBufferedReader br = new MyBufferedReader( r ); int ch=0; while( (ch=br.myRead())!=-1 ){ System.out.print((char)ch); } br.close(); } ///// @Test public void jdk_testReadLine() throws IOException { FileReader r = new FileReader("a.txt"); BufferedReader br = new BufferedReader( r ); String line = null; while( (line =br.readLine())!=null ){ System.out.println(line); } br.close(); } @Test public void my_testReadLine() throws IOException { InputStreamReader r = new InputStreamReader(new FileInputStream("a.txt")); MyBufferedReader br = new MyBufferedReader( r ); String line = null; while( (line =br.myReadLine())!=null ){ System.out.println(line); } br.close(); } }
相关文章推荐
- java --内存溢出的问题
- Java线程笔记(一)
- [转]Java学习路线
- JavaSE 高级 第07节 文件输入流FileInputStream
- Spring+Hibernate+maven整合
- 出现No configuration found for the specified action: 'tokenAction' in namespace: ''. Form action 警告的原因
- Java基础知识强化之集合框架笔记76:ConcurrentHashMap之 ConcurrentHashMap简介
- Java异常处理-----finally
- Java异常处理-----finally
- IO流输出系统信息
- JavaSE 高级 第06节 初识I、O流
- JavaEE介绍
- javaEE与java的区别
- Java中IO流操作文件总结
- Java异常处理-----非运行时异常(受检异常)
- Java异常处理-----非运行时异常(受检异常)
- JavaSE 高级 第05节 日期类与格式化
- OpenSessionInViewFilter cannot be cast to javax.servlet.Filter问题
- Java的初始化块、静态初始化块、构造函数的执行顺序及用途探究
- IO流以日志文件记录异常