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中,管道是一条不间断的字节流,用来实现程序或进程间的通信,或读写外围设备.外部文件等. 一个流,必有源端和目的端 ...
随机推荐
- 51nod 1686 第k大区间
1686 第K大区间 基准时间限制:1 秒 空间限制:131072 KB 分值: 40 难度:4级算法题 定义一个区间的值为其众数出现的次数.现给出n个数,求将所有区间的值排序后,第K大的值为多少. ...
- Mysql安装的详细教程
首先,针对本人最近几天各种电脑安装数据库失败,反思总结所有的方式.现写出详细教程,希望别的人少走弯路. 首先 这次内容分为如下几步 : 1.mysql之前安装的彻底清除 2.mysql版本的选取 3. ...
- 华科机考:N阶楼梯上楼
时间限制:1秒空间限制:32768K 题目描述 N阶楼梯上楼问题:一次可以走两阶或一阶,问有多少种上楼方式.(要求采用非递归) 输入描述: 输入包括一个整数N,(1<=N<90). 输出描 ...
- IBM-x3650做RAID5更换硬盘后rebuild步骤分享
1.按Ctrl+H进入WebBIOS配置 2.点击start 3.点击Drives,对slot5进行配置 4.选择slot5,选择Properties,点击Go按钮 5.选择MakeUnconfGoo ...
- BlockingQueue阻塞队列(解决多线程中数据安全问题 可用于抢票,秒杀)
案例:一个线程类中 private static BlockingQueue<Map<String, String>> dataQueue = new LinkedBlocki ...
- numpy.squeeze()是干啥的
例子: a = 3 print np.squeeze(a) # 输出3 a = [3] print np.squeeze(a) # 输出3 a = [[3]] print np.squeeze(a) ...
- 让互联网更快,Server Push 特性及开启方式详解
过去 Nginx 并不支持 HTTP/2 的 Server Push 特性,幸运的是 Nginx 1.13.9 已支持该特性,详情介绍请移步 Nginx 官方博客. Server Push 这个特性是 ...
- python学习之路网络编程篇(第三篇)
python线程 Threading用于提供线程相关的操作,线程是应用程序中工作的最小单元. #!/usr/bin/env python # -*- coding:utf-8 -*- import t ...
- 关于基因组注释文件GTF的解释
GTF文件的全称是gene transfer format,主要是对染色体上的基因进行标注.怎么理解呢,其实所谓的基因名,基因座等,都只是后来人们给一段DNA序列起的名字而已,还原到细胞中就是细胞核里 ...
- Go 语言条件语句
条件语句需要开发者通过指定一个或多个条件,并通过测试条件是否为 true 来决定是否执行指定语句,并在条件为 false 的情况在执行另外的语句. 下图展示了程序语言中条件语句的结构: Go 语言提供 ...