• 初探JAVA中I/O流(一)


    一.流


       流,这里是对数据交换的形象称法。进程是运行在内存中的,在运行的过程中避免不了会与外界进行数据交互。比如将数据从硬盘、控制台、管道甚至是套接字(具体点应该是我们电脑上的网卡)读到我们进程所占据的地址空间中。这个数据交换的过程,我们称之为流。在流上的操作就所谓的I/O操作了。

    二.装饰者模式


      在介绍JAVA中的I/O操作之前我们先介绍一下装饰者模式。

      装饰者模式就是对象的组合。我们如果给某个类增加新的方法,而且我们并不想修改这个类(或这个类有可能已经编译过无法修改),可以使用继承方式。在随后的时间又要加新的功能,可以再次使用继承的方式。这样虽然简单,但是随着时间的推移会导致我们子类个数迅速的膨胀。如果我们使用装饰者模式可以解决这种尴尬。

      装饰者模式图示

      Car是功能很简单的就只能跑,但是我们先让其天上飞,水里游,自动驾驶,甚至有可能在将来出现更多的功能,我们就可以使用装饰者模式。

      • ICar    抽象构件角色,这个抽象构件可以是一个接口也可以是一个具体的类
      • Car     具体构件角色
      • superCar    装饰者,持有抽象构件的引用
      • FlyCar,WaterCar,AICar    具体装饰角色,为具体构件添加新的功能

      

      创建一个能飞和能游的汽车 new WaterCar(new FlyCar(new car))

    三、I/O中的装饰者模式


      有部分类在图中没有表示出来,输出流和输入流是相对的,这里不再累述。

      Inputstream是抽象构件,ByteArrayInputStream等是基本构件,继承于InputStream。FilterInputStream是装饰者,BufferedInputStream,DataInputStream是具有特殊功能的装饰者

      

    四、I/O系统中的类关系


         

      字节流与字符流的区别就是bit数不一样,字节流是以8bit为一个单位,而字符流是以16bit为一个单位。因为java中的字符char全部采用unicode编码,8bit的字节流处理起来比较麻烦,所以在java1.1中出现了字节流(java1.0是没有的)。其实字节流和字符流区别不是太大,大多数情况下我们使用字符流,处理二进制文件时,才考虑使用字节流。

      字节流是可以转为字符流的,InputStreamReader可以把InputStream转换为Reader,OutputStreamWriter可以将OutputSteam转换为Writer。

    五.字节流与字符流过滤器对比


      我们前面提到字节流采用装饰器模式,而字符流在类的组织形式上并没有采用该模式。虽然两个有差别,但是在接口的使用上却是一致。

    装饰者  
    FilterInputStream FilterReader
    FilterOutputStream FilterWriter(抽象类,没有子类)
    具体装饰类

    可以看作是具体装饰类,

    对我们基本的字符流进行装饰

    BufferedInputStream BufferedReader
    BufferedOutPutStream BufferedWriter
    DataInputStream LineNumberReader
    PrintStream PrintWriter
    PushbackInputStream PushbackReader

    六.同步问题


    字符流Reader和Writer的子类具有自同步功能。JAVA文档中描述是如下:

    Reader类的构造器

    Reader():

      Creates a new character-stream reader whose critical sections will synchronize on the reader itself.

    Writer类构造器

    Writer():

     Creates a new character-stream writer whose critical sections will synchronize on the writer itself.

    用Writer类来举例:有一个写文件对象fileWriter(FileWriter是其对应的类,该类是Writer的子类),线程A调用了fileWriter.write(str1)来向文件写入了字符串str1,同时线程B也调用fileWriter.write(str2)向相同的文件写入了字符串str2,注意关键字“两个线程,同一对象的同一方法和相同的文件”,这时候会存在write()方法会被中断的问题(这里的write()方法和我们在Linux C中使用的write()方法有所不同,在linux C中write()会直接调用系统调用,而该write()方法中会调用的一些其他的方法,最后才会调用系统调用,所以该write()有被中断的可能)。为了防止write()被中断,在Reader或Writer类在创建的时候会为其加锁而实现同步。

    注意:如果我们使用字节流时(InputStream和OutputStream),java中并没有为我们提供同步的保证,即写一个输出流时有可能被另一个线程中断。

  • 相关阅读:
    Angular之ngRoute与uiRoute
    Python实现网络测速--转载
    You are using pip version 10.0.1, however version 20.2.2 is available.
    Pycharm导出环境,实现环境迁移
    Python编辑器之pycharm2020.1破解汉化
    Rsyslog系统日志转发
    服务器DNS配置
    服务器系统配置初始化脚本
    系统巡检用到的参数
    inotify高效监控Linux文件系统事件
  • 原文地址:https://www.cnblogs.com/xidongyu/p/5380699.html
Copyright © 2020-2023  润新知