Java基础---Java---IO流-----BufferedReader、BufferedWriter、缓冲区、装饰设计模式及和继承的区别
IO流
IO流用来处理设备之间的数据传输
java对数据的操作是过流的方式
流按操作数据分为两种:字节流与字符流
流按流向分为:输入流,输出流。
IO流常用基类
字节流的抽象基类:InputStream OutputStream
字符流的抽象基类:Reader,Writer
由这四个类派生出来的子类名称都是以其父类作为子
类名的后缀。
如InputStream 的子类 FileInpuStream
Reader的子类FileReader
数据的最常见的形式是:文件
字符读取缓冲区:
class BufferedReaderDemo
{
//创建一个读取流对象和文件相关联
FileReader fr=new FileReader("buf.txt");
//为了提高效率,加入缓冲技术,将字符流取对象作为参数传给缓冲对象的构造函数。
//只要是文本文件,都是以行的形式存在的。
//readLine返回的是该行的字符串,不包含任何行终止符,如果已经达到流的末尾,则返回null.
BufferedReader bufr=new BufferedReader(fr);
String line=null;
while(line=bufr.readLine()!=null)
{
System.out.println(line);
}
bufr.close();
}
通过缓冲区复制一个.java文件到.txt文件:
class{
public static void main(String[] args){
BufferedReader bufr=null;
BufferedWriter bufw=null;
try{
bufr=new BufferedReader(new FileReader("bufferwriteDemo.java"));
bufw=new BufferedWriter(new FilerWriter("bufwriter.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(bufr!=null)
bufr.close();
}catch(IOException e){
throw new RuntimeException("写入失败");
}
}
}
}
readline方法的原理:无论是读一行或者读取多个字符,其实都是在硬盘上一个一个的读取,所以最终使用的还是read方法一次读一个的方法。读到一个字符以后只是把它存到一行里,当读到\r,因为它不读任何终止符,
这个时候,把数组里已经存好的字符返回出来。然后接着往下读。一直到读完。。readline比read方法高效。
做一个MyBufferedReader,自定义一个类中包含一个功能和readLine一致的方法,来模拟一个BufferedReader:
import java.io.*;
class MyBufferedReader{
private FileReader r;
MyBufferedReader(FileReader r) throws IOException{//抛出异常,下面就不用try,catch了
this.r=r;//实例化
}
//可以一次读一行数据的方法
public String myReadLine(){
//定义一个临时容器,原Buffered装的是一个字符数组。定义一个StringBuilder容器,因为最终还是要将数据变成字符串。
StringBuilder sb=new StringBuilder();
int ch=0;
while((ch=r.readLine())!=-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();//模拟关闭流
}
}
class MyBufferedReaderDemo{
public static void main(String [] args){
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();
}
}
装饰者设计模式:
当想要对已有的对象进行功能增强时,可以定义类,将已有对象传入,基于已有的功能,并提供加强功能,那么自定义的该类称为装饰类。装饰者通常会通过构造对象方法接收被接收的对象,并基于被装饰的对象的功能。并提供更强的功能。
class Person{
public void chifan(){
System.out.println("吃饭");
}
}
class SuperPerson{
private Person p;
SuperPersonn(Person p){
this.p=p;
}
public void superChifan(){
System.out.println("吃甜点");
p.chifan();
System.out.println("吃饭");
System.out.println("打牌");
}
}
class PersonDemo{
public static void main(String [] args){
Person p=new Person();
//p.chifan();
SuperPerson sp=new SuperPerson(p);
sp.superChifan();
}
}
装饰和继承的区别
MyReader//专门用于读取数据的类
继承:
|MyTextReader 文本读取
|MYBufferedTextReader
|MyMediaReader 媒体读取
|MyBufferedMediaReader
|MyDataReader
|MyBufferedDataReader
class MyBufferReader{
MyBufferReader(MyTextReader text){
}
MyBufferReader(MyBufferedMediaReader media){
}
}
上面这个类的扩展性极差,找到其参数的共同类型,可以提高扩展性
下面这个就是装饰设计模式,可以将这个体系优化
|MyTextReader 文本读取
|MyMediaReader 媒体读取
|MyDataReader
|MyBufferReader
装饰模式比继承要灵活,避免了继承了体系的冗余,而且降低了类与类之间的关系
装饰类因为增强已有对象,具备的功能和已有的是相同的,只不过提供了更强功能,所以装饰类和被装饰类通常是都属于一个体系中的。
MyReader//专门读取数据的类
class MyBufferReader{
MyBufferReader(MyReader r){
}
}
Java基础---Java---IO流-----BufferedReader、BufferedWriter、缓冲区、装饰设计模式及和继承的区别的更多相关文章
- java基础之IO流(二)之字符流
java基础之IO流(二)之字符流 字符流,顾名思义,它是以字符为数据处理单元的流对象,那么字符流和字节流之间的关系又是如何呢? 字符流可以理解为是字节流+字符编码集额一种封装与抽象,专门设计用来读写 ...
- Java基础之IO流整理
Java基础之IO流 Java IO流使用装饰器设计模式,因此如果不能理清其中的关系的话很容易把各种流搞混,此文将简单的几个流进行梳理,后序遇见新的流会继续更新(本文下方还附有xmind文件链接) 抽 ...
- java基础之IO流(一)字节流
java基础之IO流(一)之字节流 IO流体系太大,涉及到的各种流对象,我觉得很有必要总结一下. 那什么是IO流,IO代表Input.Output,而流就是原始数据源与目标媒介的数据传输的一种抽象.典 ...
- JAVA基础之IO流知识总结
一.IO流体系图 IO常用的几个流: [I/O流原理作用] Input/Output:输入输出机制 输入机制:允许java程序获取外部设备的数据(磁盘,光盘,网络等). 输出机制:保留java程序中的 ...
- 黑马程序员——JAVA基础之IO流缓冲区,转换流,字节流
------- android培训.java培训.期待与您交流! ---------- 字符流的缓冲区 缓冲区的出现提高了对数据的读写效率. 对应类 • BufferedWriter ...
- java基础之io流总结一:io流概述
IO流概念: 流是一组有顺序的,有起点和终点的字节集合,是对数据传输的总称或抽象.io流是实现输入和输出的基础,可以方便的实现数据的输入和输出操作. IO流的分类: 根据处理数据类型的不同分为:字符流 ...
- 【java基础】]IO流
IO流 概念: 流的概念源于unix中管道(pipe)的概念,在unix中,管道是一条不间断的字节流,用来实现程序或进程间的通信,或读写外围设备,外部文件等 一个流,一定能够会有源和去向(目的地),他 ...
- Java基础之IO流学习总结
Java流操作有关的类或接口: Java流类图结构: 流的概念和作用 流是一组有顺序的,有起点和终点的字节集合,是对数据传输的总称或抽象.即数据在两设备间的传输称为流,流的本质是数据传输,根据数据传输 ...
- Java基础:IO流之字节流和字符流
1. 流的概念 流(stream)的概念源于UNIX中管道(pipe)的概念.在UNIX中,管道是一条不间断的字节流,用来实现程序或进程间的通信,或读写外围设备.外部文件等. 一个流,必有源端和目的端 ...
随机推荐
- bzoj 4006: [JLOI2015]管道连接
Description 小铭铭最近进入了某情报部门,该部门正在被如何建立安全的通道连接困扰. 该部门有 n 个情报站,用 1 到 n 的整数编号.给出 m 对情报站 ui;vi 和费用 wi,表示情 ...
- Mysql 基于GTID的主从复制(实操)
实现环境: Master 主:192.168.0.102 (Mysql 5.6.36) Slave 从 :192.168.0.103 (Mysql 5.6.36) 步骤1.在主DB服务器上建立复制账 ...
- udacity/CarND-Path-Planning-Project 工程详细配置过程——吐血整理
本人原创,转载请注明地址 学习udacity/CarND-Path-Planning-Project 工程过程 1.首先登陆 jeremy-shannon/CarND-Path-Planning-Pr ...
- python2.7入门---变量类型
这篇文章呢,主要是用来记录python中的变量类型学习内容的.接下来就来看一下变量类型,那么什么是变量呢.变量存储在内存中的值.这就意味着在创建变量时会在内存中开辟一个空间.基于变量的数据类型,解 ...
- 使用svn无法cleanup和lock问题
step1: 到 sqlite官网 (http://www.sqlite.org/download.html) 下载 sqlite3.exe 找到 Precompiled Binaries for W ...
- AngularJs 笔记
初识 directive 指令 ng-app 初始化一个AngularJs应用程序(通过一个值(比如 ng-app="myModule")连接到代码模块.) ng-init 初始化 ...
- Splay伸展树入门(单点操作,区间维护)附例题模板
Pps:终于学会了伸展树的区间操作,做一个完整的总结,总结一下自己的伸展树的单点操作和区间维护,顺便给未来的自己总结复习用. splay是一种平衡树,[平均]操作复杂度O(nlogn).首先平衡树先是 ...
- 01_Struts2概述及环境搭建
1.Struts2概述: Struts2是一个用来开发MVC应用程序的框架. Struts2提供了web应用程序开发过程中一些常见问题的解决方案; 对用户输入的数据进行合法性验证 统一的布局 可扩展性 ...
- Docker外部访问容器
容器中可以运行一些网络应用,要让外部也可以访问这些应用,可以通过 -P 或 -p 参数来指定端口映射. 当使用 -P 标记时,Docker 会随机映射一个 49000~49900 的端口到内部容器开放 ...
- UE4使用UMG接口操作界面
原文链接:http://gad.qq.com/article/detail/7181131 本文首发腾讯GAD开发者平台,未经允许,不得转载 UE4的蓝图之强大让人欲罢不能,但是实际在项目的开发中,C ...