提要

01 IO流(BufferedWriter)
02 IO流(BufferedReader)
03 IO流(通过缓冲区复制文本文件)
04 IO流(readLine的原理)
05 IO流(MyBufferedReader)
06 IO流(装饰设计模式)
07 IO流(装饰和继承的区别)

01 IO流(BufferedWriter)
字符流的缓冲区
缓冲区的出现提高了对数据的读写效率。
对应类
BufferedWriter
BufferedReader
缓冲区要结合流才可以使用
在流的基础上对流的功能进行了加强

 /*
缓冲区的出现是为了提高流的操作效率,
所以在创建缓冲区之前,必须要先有流对象。 该缓冲区提供了一个跨平台的换行方法 newLine()
*/
import java.io.*;
public class BufferedWriterDemo
{
public static void main(String[] args)throws IOException
{
//创建一个字符写入流对象
FileWriter fw=new FileWriter("buf.txt"); //为了提高字符写入流效率,加入了缓冲区
//只要将需要被提高效率的流对象作为参数传递给缓冲区的构造函数即可
BufferedWriter bufw=new BufferedWriter(fw); for(int x=1;x<5;x++)
{
bufw.write("abcde"+x);
//写入一个行分隔符,是跨平台的
bufw.newLine();
//记住,只要用到缓冲区,就要记得刷新
bufw.flush();
} //其实,关闭缓冲区,就是在关闭缓冲区流中的对象
bufw.close(); }
}

02 IO流(BufferedReader)

 /*
字符读取缓冲区
该缓冲区提供了一个一次读一行的方法,readLine()
*/
import java.io.*;
public class BufferedReaderDemo
{
public static void main(String[] args)throws IOException
{
//创建一个读取流对象和文件相关连
FileReader fr=new FileReader("buf.txt"); //为了提高效率,加入缓冲技术,
//将字符读取流对象作为参数传递给缓冲对象的构造函数
BufferedReader bufr=new BufferedReader(fr); String line; while((line=bufr.readLine())!=null)
{
System.out.println(line);
} bufr.close();
}
}

03 IO流(通过缓冲区复制文本文件)

注意:readLine方法只返回回车符前面的部分,并不返回回车符。

 /*
通过缓冲区复制一个.java文件
*/
import java.io.*;
public class CopyTextByBuf
{
public static void main(String[] args)
{
BufferedReader bufr=null;
BufferedWriter bufw=null; try
{
bufr=new BufferedReader(new FileReader("BufferedWriterDemo.java"));
bufw=new BufferedWriter(new FileWriter("buffferWriter_Copy.txt")); String line;
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("写入关闭失败!");
}
}
}
}

04 IO流(readLine的原理)

无论是读一行,或者读取多个字符,其实最终都是在硬盘上一个一个读取,所以最终使用的还是read方法一次一次读取。

05 IO流(MyBufferedReader)

 /*
明白了BufferedReader类中特有方法reaLine的原理后,
可以自定义一个类中包含一个功能和readLine一致的方法。
来模拟一下BufferedReader */
import java.io.*;
class MyBufferedReader
{
private FileReader r;
MyBufferedReader(FileReader 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();
else
sb.append((char)ch);
}
if(sb.length()!=0)
return sb.toString();
return null;
}
public void myClose()throws IOException
{
r.close();
}
} public class MyBufferedReaderDemo
{
public static void main(String[] args) throws IOException
{
FileReader fr=new FileReader("buf.txt"); MyBufferedReader myBuf=new MyBufferedReader(fr);
String line=null;
while((line=myBuf.myReadLine())!=null)
{
System.out.println(line);
}
myBuf.myClose(); }
}

06 IO流(装饰设计模式)

 /*
装饰设计模式:
当想要对已有的对象进行功能增强时,
可以定义类,将已有对象传入,基于已有功能,并提供加强功能
那么自定义的这个类就成为装饰类 装饰类通常会通过构造方法接收被装饰的的对象
并基于被装饰对象的功能,提供更强的功能
*/
class Person
{
public void chiFan()
{
System.out.println("吃饭");
}
}
class SuperPerson
{
private Person p;
public SuperPerson(Person p)
{
this.p=p;
}
public void superChiFan()
{
System.out.println("开胃酒");
p.chiFan();
System.out.println("甜点");
System.out.println("来一根"); }
}
public class PersonDemo
{
public static void main(String[] args)
{
SuperPerson sp=new SuperPerson(new Person());
sp.superChiFan(); }
}

07 IO流(装饰和继承的区别)

用继承体系来实现功能增强
MyReader//专门用于读取数据的类
|--MyTextReader
  |--MyBufferTextReader
|--MyMediaTextReader
  |--MyBufferMediaReader
|--MyDataReader
  |--MyBufferDataReader

class MyBufferReader
{
MyBufferReader(MyTextReader text)
{}
MyBufferReader(MyMediaTextReader media text)
{}

}
上面这个类的扩展性很差
找到其参数的共同类型,通过多态的形式,可以提高扩展性
class MyBufferReader extends MyReader
{
MyBufferReader(MyReader r)
{}
}

用装饰来实现功能增强
MyReader//专门用于读取数据的类
|--MyTextReader
|--MyMediaReader
|--MyDataReader
|--MyBufferReader

装饰模式比继承要灵活,避免了继承体系的臃肿
而且降低了类与类之间的关系。

装饰类因为增强已有对象,具备的功能和已有对象是相同的,
只不过是提供了更强的功能
所以装饰类和被装饰类通常是属于一个体系的

IO流01--毕向东JAVA基础教程视频学习笔记的更多相关文章

  1. 多线程--毕向东java基础教程视频学习笔记

    目录 1.多线程运行的安全问题 2.多线程同步代码块 3.同步方法的锁是this 4.静态同步方法的锁是Class对象 5.单例设计模式(面试中的考点) 6.死锁(一个发生死锁的例子) 多线程运行的安 ...

  2. IO流03--毕向东JAVA基础教程视频学习笔记

    提要 16 读取转换流17 写入转换流18 流操作规律-119 流操作规律-220 改变标准输入输出设备21 异常的日志信息22 系统信息 16 读取转换流 字符流体系中的InputStreamRea ...

  3. 网络编程3--毕向东java基础教程视频学习笔记

    Day24 01 TCP上传图片02 客户端并发上传图片03 客户端并发登录04 浏览器客户端-自定义服务端05 浏览器客户端-Tomcat服务端 01 TCP上传图片 import java.net ...

  4. 网络编程2--毕向东java基础教程视频学习笔记

    Day 23 08 Udp接收端09 Udp键盘录入数据方式10 Udp聊天11 TCP传输12 TCP传输213 TCP练习14 TCP复制文件 08 Udp接收端 需求:定义一个应用程序,用于接收 ...

  5. IO流04--毕向东JAVA基础教程视频学习笔记

    Day20 01 File概述02 File对象功能-创建和删除03 File对象功能-判断04 File对象功能-获取05 File对象功能-文件列表106 File对象功能-文件列表207 列出目 ...

  6. IO流05--毕向东JAVA基础教程视频学习笔记

    Day20 10 创建java文件列表11 Properties简述12 Properties存取13 Properties存取配置文件14 Properties练习15 PrintWriter16 ...

  7. IO流02--毕向东JAVA基础教程视频学习笔记

    提要 08 自定义装饰类09 LineNumberReader10 MyLineNumberReader11 字节流File读写操作12 拷贝图片13 字节流的缓冲区14 自定义字节流的缓冲区-rea ...

  8. 网络编程1--毕向东java基础教程视频学习笔记

    目录: 01 网络编程概述1 02 网络编程概述2 03网络编程 网络模型 04网络编程 IP地址 05网络编程 TCP和UDP 06网络编程 Socket 07网络编程 UDP发送端 01 网络编程 ...

  9. 集合3--毕向东java基础教程视频学习笔记

    Day 15 集合框架01 TreeSet02 TreeSet存储自定义对象03 二叉树04 实现Comparator方式排序05 TreeSet练习06 泛型概述07 泛型使用08 泛型类09 泛型 ...

随机推荐

  1. Android学习笔记之SoftReference软引用...

    PS:其实这一篇和上一篇很类似,都是为了解决内存不足(OOM)这种情况的发生... 学习内容: 1.对象的引用类....   最近也是通过项目中知道了一些东西,涉及到了对象的引用类,对象的引用类分为多 ...

  2. SQL 表变量和临时表

    SQL 表变量和临时表 表变量:存储在内存中,作用域是脚本的执行过程中,脚本执行完毕之后就会释放内存,适合短时间内存储数据量小的数据集. 优点:使用灵活,使用完之后立即释放,不占用物理存储空间 缺点: ...

  3. Spring应用——对 JDBC 的支持

    一.说明 1.Spring JDBC 对原始的 JDBC 进行了封装,使其更加易用. 2.JdbcTemplate 作为 Spring JDBC 的核心,为不同类型的 JDBC 操作提供了模板方法. ...

  4. Orleans之Hello World

    接触Orleans 有一段时间了,之前也翻译了一系列官网文档,今天我们就来一个实际的例子,来看看到底如何用这个东西来开发项目,当然经典的也是醉人的,我们就从HelloWorld开始吧. 通过前面的知识 ...

  5. c++容器(vector、list、deque)

    vector ,deque 和 list 顺序性容器: 向量 vector :   是一个线性顺序结构.相当于数组,但其大小可以不预先指定,并且自动扩展.它可以像数组一样被操作,由于它的特性我们完全可 ...

  6. 【jQuery基础学习】01 jQuery选择器

    关于CSS选择器 jQuery选择器涉及到CSS,CSS技术使得网页的结构与表现样式完全分离. 同样CSS也需要找到某个网页的结构才能改变其样式,这就是CSS选择器. 常用的CSS选择器如下: 标签选 ...

  7. 重新想象 Windows 8.1 Store Apps (87) - TTS: Speak Text, Speak SSML

    [源码下载] 重新想象 Windows 8.1 Store Apps (87) - TTS: Speak Text, Speak SSML 作者:webabcd 介绍重新想象 Windows 8.1 ...

  8. 关于spring配置文件properties的问题

    我遇到的问题是我将properties放在src下面的包中不能被spring扫描到,会报配置文件找不到的错误.但是如果放在src目录下就能够被spring扫描到,现在还不知道为什么这样,记个笔记,留到 ...

  9. css样式reset

    初始化样式. @CHARSET "UTF-8"; body,ur,ol,li,p,h1,h2,h3,h4,h5,h6,form,fieldset,table,td,img,div, ...

  10. jquery function Optional Arguments

    1.javascript 选项散列对象 function Test(p1,p2,p3,p4,p5){ //do something } call: 参数可选 Test({ p1:value1, p2: ...