IO流

IO流用来处理设备之间的数据传输

java对数据的操作是过流的方式

流按操作数据分为两种:字节流与字符流

流按流向分为:输入流,输出流。





IO流常用基类

字节流的抽象基类:InputStream OutputStream

字符流的抽象基类:Reader,Writer

由这四个类派生出来的子类名称都是以其父类作为子

类名的后缀。

如InputStream 的子类 FileInpuStream

Reader的子类FileReader





数据的最常见的形式是:文件





字符读取缓冲区:

  1. class BufferedReaderDemo
  2. {
  3. //创建一个读取流对象和文件相关联
  4. FileReader fr=new FileReader("buf.txt");
  5. //为了提高效率,加入缓冲技术,将字符流取对象作为参数传给缓冲对象的构造函数。
  6. //只要是文本文件,都是以行的形式存在的。
  7. //readLine返回的是该行的字符串,不包含任何行终止符,如果已经达到流的末尾,则返回null.
  8. BufferedReader bufr=new BufferedReader(fr);
  9. String line=null;
  10. while(line=bufr.readLine()!=null)
  11. {
  12. System.out.println(line);
  13. }
  14. bufr.close();
  15.  
  16. }

通过缓冲区复制一个.java文件到.txt文件:

  1. class{
  2. public static void main(String[] args){
  3. BufferedReader bufr=null;
  4. BufferedWriter bufw=null;
  5. try{
  6. bufr=new BufferedReader(new FileReader("bufferwriteDemo.java"));
  7. bufw=new BufferedWriter(new FilerWriter("bufwriter.txt"));
  8. String line=null;//是两个流之间的中转站
  9. while(line=bufr.readLine()!=null){
  10. bufw.write(line);//读取一行
  11. bufw.newLine();//记得换行
  12. bufw.flush();//清空缓冲区数据
  13. }
  14. //下面是抛出异常
  15. }catch(IOException e){
  16. throw new RuntimeException("读取关闭失败");
  17. }
  18. finally{
  19. try{
  20. if(bufr!=null)
  21. bufr.close();
  22. }catch(IOException e){
  23. throw new RuntimeException("读取失败");
  24. }
  25. try{
  26. if(bufr!=null)
  27. bufr.close();
  28. }catch(IOException e){
  29. throw new RuntimeException("写入失败");
  30. }
  31. }
  32.  
  33. }
  34.  
  35. }

readline方法的原理:无论是读一行或者读取多个字符,其实都是在硬盘上一个一个的读取,所以最终使用的还是read方法一次读一个的方法。读到一个字符以后只是把它存到一行里,当读到\r,因为它不读任何终止符,

这个时候,把数组里已经存好的字符返回出来。然后接着往下读。一直到读完。。readline比read方法高效。














做一个MyBufferedReader,自定义一个类中包含一个功能和readLine一致的方法,来模拟一个BufferedReader:

  1. import java.io.*;
  2. class MyBufferedReader{
  3. private FileReader r;
  4. MyBufferedReader(FileReader r) throws IOException{//抛出异常,下面就不用try,catch了
  5. this.r=r;//实例化
  6.  
  7. }
  8. //可以一次读一行数据的方法
  9. public String myReadLine(){
  10. //定义一个临时容器,原Buffered装的是一个字符数组。定义一个StringBuilder容器,因为最终还是要将数据变成字符串。
  11. StringBuilder sb=new StringBuilder();
  12. int ch=0;
  13. while((ch=r.readLine())!=-1){
  14. if(ch=='\r')
  15. continue;
  16. if(ch=='\n')
  17. return sb.toString();
  18. else
  19. sb.append((char)ch);//在指定元素结尾插入字符
  20.  
  21. }
  22. if(sb.length()!=0)
  23. return sb.toString();
  24. return null;
  25. }
  26.  
  27. public void myClose()throws IOException{
  28. r.close();//模拟关闭流
  29. }
  30.  
  31. }
  32.  
  33. class MyBufferedReaderDemo{
  34. public static void main(String [] args){
  35. FileReader fr=new FileReader("buf.txt");
  36. MyBufferedReader myBuf=new MyBufferedReader(fr);//
  37. String line=null;
  38. while((line=myBuf.myReadLine()!=null){
  39. System.out.println("line");
  40.  
  41. }
  42. myBuf.myClose();
  43.  
  44. }
  45. }

装饰者设计模式:

当想要对已有的对象进行功能增强时,可以定义类,将已有对象传入,基于已有的功能,并提供加强功能,那么自定义的该类称为装饰类。装饰者通常会通过构造对象方法接收被接收的对象,并基于被装饰的对象的功能。并提供更强的功能。

  1. class Person{
  2. public void chifan(){
  3. System.out.println("吃饭");
  4. }
  5. }
  6. class SuperPerson{
  7. private Person p;
  8. SuperPersonn(Person p){
  9. this.p=p;
  10. }
  11. public void superChifan(){
  12. System.out.println("吃甜点");
  13. p.chifan();
  14. System.out.println("吃饭");
  15. System.out.println("打牌");
  16. }
  17. }
  18.  
  19. class PersonDemo{
  20. public static void main(String [] args){
  21. Person p=new Person();
  22. //p.chifan();
  23. SuperPerson sp=new SuperPerson(p);
  24. sp.superChifan();
  25. }
  26. }

装饰和继承的区别

MyReader//专门用于读取数据的类

继承:

|MyTextReader 文本读取

|MYBufferedTextReader

|MyMediaReader 媒体读取

|MyBufferedMediaReader

|MyDataReader

|MyBufferedDataReader

  1. class MyBufferReader{
  2. MyBufferReader(MyTextReader text){
  3. }
  4. MyBufferReader(MyBufferedMediaReader media){
  5. }
  6.  
  7. }

上面这个类的扩展性极差,找到其参数的共同类型,可以提高扩展性





下面这个就是装饰设计模式,可以将这个体系优化

|MyTextReader 文本读取

|MyMediaReader 媒体读取

|MyDataReader

|MyBufferReader

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

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

MyReader//专门读取数据的类

  1. class MyBufferReader{
  2. MyBufferReader(MyReader r){
  3.  
  4. }
  5. }

Java基础---Java---IO流-----BufferedReader、BufferedWriter、缓冲区、装饰设计模式及和继承的区别的更多相关文章

  1. java基础之IO流(二)之字符流

    java基础之IO流(二)之字符流 字符流,顾名思义,它是以字符为数据处理单元的流对象,那么字符流和字节流之间的关系又是如何呢? 字符流可以理解为是字节流+字符编码集额一种封装与抽象,专门设计用来读写 ...

  2. Java基础之IO流整理

    Java基础之IO流 Java IO流使用装饰器设计模式,因此如果不能理清其中的关系的话很容易把各种流搞混,此文将简单的几个流进行梳理,后序遇见新的流会继续更新(本文下方还附有xmind文件链接) 抽 ...

  3. java基础之IO流(一)字节流

    java基础之IO流(一)之字节流 IO流体系太大,涉及到的各种流对象,我觉得很有必要总结一下. 那什么是IO流,IO代表Input.Output,而流就是原始数据源与目标媒介的数据传输的一种抽象.典 ...

  4. JAVA基础之IO流知识总结

    一.IO流体系图 IO常用的几个流: [I/O流原理作用] Input/Output:输入输出机制 输入机制:允许java程序获取外部设备的数据(磁盘,光盘,网络等). 输出机制:保留java程序中的 ...

  5. 黑马程序员——JAVA基础之IO流缓冲区,转换流,字节流

    ------- android培训.java培训.期待与您交流! ---------- 字符流的缓冲区        缓冲区的出现提高了对数据的读写效率. 对应类 •  BufferedWriter ...

  6. java基础之io流总结一:io流概述

    IO流概念: 流是一组有顺序的,有起点和终点的字节集合,是对数据传输的总称或抽象.io流是实现输入和输出的基础,可以方便的实现数据的输入和输出操作. IO流的分类: 根据处理数据类型的不同分为:字符流 ...

  7. 【java基础】]IO流

    IO流 概念: 流的概念源于unix中管道(pipe)的概念,在unix中,管道是一条不间断的字节流,用来实现程序或进程间的通信,或读写外围设备,外部文件等 一个流,一定能够会有源和去向(目的地),他 ...

  8. Java基础之IO流学习总结

    Java流操作有关的类或接口: Java流类图结构: 流的概念和作用 流是一组有顺序的,有起点和终点的字节集合,是对数据传输的总称或抽象.即数据在两设备间的传输称为流,流的本质是数据传输,根据数据传输 ...

  9. Java基础:IO流之字节流和字符流

    1. 流的概念 流(stream)的概念源于UNIX中管道(pipe)的概念.在UNIX中,管道是一条不间断的字节流,用来实现程序或进程间的通信,或读写外围设备.外部文件等. 一个流,必有源端和目的端 ...

随机推荐

  1. hdu 5266 pog loves szh III(lca + 线段树)

    I - pog loves szh III Time Limit:6000MS     Memory Limit:131072KB     64bit IO Format:%I64d & %I ...

  2. 【Aho-Corasick automation 大米饼模板】

    自动机要打熟.自动机要打好.自动机要打得美妙. [例子:HDU2222] #include<stdio.h> #include<queue> #include<cstri ...

  3. BZOJ4079 [Wf2014]Pachinko

    完整题面: 设f(i,j)表示路径经过(i,j)这个点的概率,列出方程消元. 但暴力消元的复杂度是$O((nm)^3)$,注意每一次消元只会影响前后m个方程,所以我们可以对于第i行,只存[i-m,i+ ...

  4. 零开始:NetCore项目权限管理系统:基础框架搭建

    有兴趣的同学可以一起做 喜欢NetCore的朋友,欢迎加群QQ:86594082 源码地址:https://github.com/feiyit/SoaProJect 新建一个空的解决方案,建立对应的解 ...

  5. IBM-x3650做RAID5更换硬盘后rebuild步骤分享

    1.按Ctrl+H进入WebBIOS配置 2.点击start 3.点击Drives,对slot5进行配置 4.选择slot5,选择Properties,点击Go按钮 5.选择MakeUnconfGoo ...

  6. KMP算法小结

    最近看了一些关于KMP算法的资料,在此写一篇博客总计一下. 1.KMP算法介绍 KMP算法是一种字符串搜索的改进算法,由D.E.Knuth,J.H.Morris和V.R.Pratt同时发现,因此人们称 ...

  7. Linux用户管理命令大全

    1.添加用户,首先用adduser命令添加一个普通用户,命令如下: $ adduser tommy //添加一个名为tommy的用户 $ passwd tommy //修改密码 Changing pa ...

  8. redis在java客户端的操作

    redis高性能,速度快,效率高的特点,用来做缓存服务器是很不错的选择.(和memcache相似)redis在客户端的操作步骤: 1.redis单机版操作 1.1通过Jedis对象操作 (1)将安装r ...

  9. MongoDB 原子操作

    mongodb不支持事务,所以,在你的项目中应用时,要注意这点.无论什么设计,都不要要求mongodb保证数据的完整性. 但是mongodb提供了许多原子操作,比如文档的保存,修改,删除等,都是原子操 ...

  10. 配置 docker0 网桥

    Docker 服务默认会创建一个 docker0 网桥(其上有一个 docker0 内部接口),它在内核层连通了其他的物理或虚拟网卡,这就将所有容器和本地主机都放到同一个物理网络. Docker 默认 ...