IO_02_字符流的缓冲区
来源:互联网 发布:淘宝商品改折扣价影响 编辑:程序博客网 时间:2024/05/20 04:32
字符读取流缓冲区
缓冲区的出现是为了提高流的操作效率而出现的。
所以在创建缓冲区之前,必须要先有流对象。
该缓冲区中提供了一个跨平台的换行符。
newLine();
class BufferedWriterDemo{public static void main(String[] args) throws IOException{//创建一个字符写入流对象。FileWriter fw = new FileWriter("src\\com\\buffered\\writer\\buf.txt");//为了提高字符写入流效率。加入了缓冲技术。//只要将需要被提高效率的流对象作为参数传递给缓冲区的构造函数即可。BufferedWriter bufw = new BufferedWriter(fw);for(int x=1; x<5; x++){bufw.write("abcd"+x);bufw.newLine();bufw.flush();}//记住,只要用到缓冲区,就要记得刷新。//bufw.flush();//其实关闭缓冲区,就是在关闭缓冲区中的流对象。bufw.close();}}
字符读取流缓冲区:
该缓冲区提供了一个一次读一行的方法 readLine,方便于对文本数据的获取。
当返回null时,表示读到文件末尾。
readLine方法返回的时候只返回回车符之前的数据内容。并不返回回车符。
class BufferedReaderDemo{public static void main(String[] args) throws IOException{//创建一个读取流对象和文件相关联。FileReader fr = new FileReader("src\\com\\buffered\\ref\\buf.txt");//为了提高效率。加入缓冲技术。将字符读取流对象作为参数传递给缓冲对象的构造函数。BufferedReader bufr = new BufferedReader(fr);String line = null;while((line=bufr.readLine())!=null){System.out.print(line);}bufr.close();}}
明白了BufferedReader类中特有方法readLine的原理后,可以自定义一个类中包含一个功能和readLine一致的方法。来模拟一下BufferedReader
class MyBufferedReader extends Reader{private Reader r;MyBufferedReader(Reader r){this.r = r;}//可以一次读一行数据的方法。public String myReadLine()throws IOException{//定义一个临时容器。原BufferReader封装的是字符数组。//为了演示方便。定义一个StringBuilder容器。因为最终还是要将数据变成字符串。StringBuilder sb = new StringBuilder();int ch = 0;while((ch=r.read())!=-1){if(ch=='\r')continue;if(ch=='\n')return sb.toString();elsesb.append((char)ch);}if(sb.length()!=0)return sb.toString();return null;}/*覆盖Reader类中的抽象方法。*/public int read(char[] cbuf, int off, int len) throws IOException{return r.read(cbuf,off,len) ;}public void close()throws IOException{r.close();}public void myClose()throws IOException{r.close();}}class MyBufferedReaderDemo{public static void main(String[] args) throws IOException{FileReader fr = new FileReader("src\\com\\buffered\\ref\\buf.txt");MyBufferedReader myBuf = new MyBufferedReader(fr);String line = null;while((line=myBuf.myReadLine())!=null){System.out.println(line);}myBuf.myClose();}}通过缓冲区复制一个.java文件。
class CopyTextByBuf{public static void main(String[] args) {BufferedReader bufr = null;BufferedWriter bufw = null;try{bufr = new BufferedReader(new FileReader("src\\com\\buffered\\ref\\buf.txt"));bufw = new BufferedWriter(new FileWriter("src\\com\\buffered\\ref\\bufWriter_Copy.txt"));String line = null;while((line=bufr.readLine())!=null){bufw.write(line);bufw.newLine();bufw.flush();}}catch (IOException e){throw new RuntimeException("读写失败");}finally{try{if(bufr!=null)bufr.close();}catch (IOException e){throw new RuntimeException("读取关闭失败");}try{if(bufw!=null)bufw.close();}catch (IOException e){throw new RuntimeException("写入关闭失败");}}}}
实际BufferReader是包装了FileReader,采用的装饰设计模式
装饰与继承
MyReader//专门用于读取数据的类。
|--MyTextReader
|--MyBufferTextReader
|--MyMediaReader
|--MyBufferMediaReader
|--MyDataReader
|--MyBufferDataReader
class MyBufferReader
{
MyBufferReader(MyTextReader text)
{}
MyBufferReader(MyMediaReader media)
{}
}
上面这个类扩展性很差。
找到其参数的共同类型。通过多态的形式。可以提高扩展性。
class MyBufferReader extends MyReader
{
private MyReader r;
MyBufferReader(MyReader r)
{}
}
MyReader//专门用于读取数据的类。
|--MyTextReader
|--MyMediaReader
|--MyDataReader
|--MyBufferReader
以前是通过继承将每一个子类都具备缓冲功能。
那么继承体系会复杂,并不利于扩展。
现在优化思想。单独描述一下缓冲内容。
将需要被缓冲的对象。传递进来。也就是,谁需要被缓冲,谁就作为参数传递给缓冲区。
这样继承体系就变得很简单。优化了体系结构。
装饰模式比继承要灵活。避免了继承体系臃肿。
而且降低了类于类之间的关系。
装饰类因为增强已有对象,具备的功能和已有的是相同的,只不过提供了更强功能。
所以装饰类和被装饰类通常是都属于一个体系中的。
- IO_02_字符流的缓冲区
- 字符流的缓冲区
- 黑马程序员_字符流的缓冲区
- 字符流缓冲区实现文件的读取
- 字符流的缓冲区和装饰模式
- 字符流程的缓冲区
- 字符流缓冲区
- 自定义字符流缓冲区
- 字符流缓冲区
- 字符流,字符流的缓冲区,序列流
- 字符流缓冲区:BufferedWriter,BufferedReader
- Java IO 字符流 缓冲区
- 字符流(缓冲区问题)
- java 字节流与字符流的区别(缓冲区)
- 黑马程序员 字节流和字符流缓冲区的对比
- 黑马程序员—IO流字符读取流的缓冲区
- 黑马程序员-day19-IO流(字符流的缓冲区)
- 浅谈我对IO流的了解 - 字符流缓冲区
- python常见错误
- tornado 10、网站安全问题
- Spark——分布式并行计算概念
- Git操作详解
- 你应该知道的HTTP请求返回状态码和提示信息
- IO_02_字符流的缓冲区
- 在Eclipse里设置查看Java源码的方法
- Java并发编程:Synchronized及其实现原理 (r)
- Hive 学习笔记
- Spark性能优化指南——高级篇
- Java并发编程:Synchronized底层优化(偏向锁、轻量级锁)
- Java集合框架结构
- Android控件定制显示样式
- spoj Find Log