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中,管道是一条不间断的字节流,用来实现程序或进程间的通信,或读写外围设备.外部文件等. 一个流,必有源端和目的端 ...
随机推荐
- hdu 5266 pog loves szh III(lca + 线段树)
I - pog loves szh III Time Limit:6000MS Memory Limit:131072KB 64bit IO Format:%I64d & %I ...
- 【Aho-Corasick automation 大米饼模板】
自动机要打熟.自动机要打好.自动机要打得美妙. [例子:HDU2222] #include<stdio.h> #include<queue> #include<cstri ...
- BZOJ4079 [Wf2014]Pachinko
完整题面: 设f(i,j)表示路径经过(i,j)这个点的概率,列出方程消元. 但暴力消元的复杂度是$O((nm)^3)$,注意每一次消元只会影响前后m个方程,所以我们可以对于第i行,只存[i-m,i+ ...
- 零开始:NetCore项目权限管理系统:基础框架搭建
有兴趣的同学可以一起做 喜欢NetCore的朋友,欢迎加群QQ:86594082 源码地址:https://github.com/feiyit/SoaProJect 新建一个空的解决方案,建立对应的解 ...
- IBM-x3650做RAID5更换硬盘后rebuild步骤分享
1.按Ctrl+H进入WebBIOS配置 2.点击start 3.点击Drives,对slot5进行配置 4.选择slot5,选择Properties,点击Go按钮 5.选择MakeUnconfGoo ...
- KMP算法小结
最近看了一些关于KMP算法的资料,在此写一篇博客总计一下. 1.KMP算法介绍 KMP算法是一种字符串搜索的改进算法,由D.E.Knuth,J.H.Morris和V.R.Pratt同时发现,因此人们称 ...
- Linux用户管理命令大全
1.添加用户,首先用adduser命令添加一个普通用户,命令如下: $ adduser tommy //添加一个名为tommy的用户 $ passwd tommy //修改密码 Changing pa ...
- redis在java客户端的操作
redis高性能,速度快,效率高的特点,用来做缓存服务器是很不错的选择.(和memcache相似)redis在客户端的操作步骤: 1.redis单机版操作 1.1通过Jedis对象操作 (1)将安装r ...
- MongoDB 原子操作
mongodb不支持事务,所以,在你的项目中应用时,要注意这点.无论什么设计,都不要要求mongodb保证数据的完整性. 但是mongodb提供了许多原子操作,比如文档的保存,修改,删除等,都是原子操 ...
- 配置 docker0 网桥
Docker 服务默认会创建一个 docker0 网桥(其上有一个 docker0 内部接口),它在内核层连通了其他的物理或虚拟网卡,这就将所有容器和本地主机都放到同一个物理网络. Docker 默认 ...