一.流


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

二.装饰者模式


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

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

  装饰者模式图示

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

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

  

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

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


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

  Input是抽象构件,FilterInputStream是装饰者

  

四、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中并没有为我们提供同步的保证,即写一个输出流时有可能被另一个线程中断。

初探JAVA中I/O流(一)的更多相关文章

  1. 初探JAVA中I/O流(二)

    1.缓冲输入文件 FileReader BufferedReader FileReader可以直接对文件进行读操作.但是简化编程,加快读取速度,我们加入了缓冲机制,使用了BufferedReader. ...

  2. java中的IO流

    Java中的IO流 在之前的时候我已经接触过C#中的IO流,也就是说集中数据固化的方式之一,那么我们今天来说一下java中的IO流. 首先,我们学习IO流就是要对文件或目录进行一系列的操作,那么怎样操 ...

  3. java中的缓冲流BufferedWriter和BufferedReader

    java中的缓冲流有BufferedWriter和BufferedReader 在java api 手册中这样说缓冲流: 从字符输入流中读取文本,缓冲各个字符,从而实现字符.数组和行的高效读取.可以指 ...

  4. java 中 “文件” 和 “流” 的简单分析

    java 中 FIle 和 流的简单分析 File类 简单File 常用方法 创建一个File 对象,检验文件是否存在,若不存在就创建,然后对File的类的这部分操作进行演示,如文件的名称.大小等 / ...

  5. Java中的IO流总结

    Java中的IO流总结 1. 流的继承关系,以及字节流和字符流. 2. 节点流FileOutputStream和FileInputStream和处理流BufferedInputStream和Buffe ...

  6. Java中的IO流大体介绍

    由于Java中的IO流是在是知识点繁多,所以我大约花了1周的时间将其整理起来.但是整理起来后并不是将完事了,我还是要分字节流和字符流来讲述.然后字节流和字符流中还有是否带有缓冲流. 讲述完IO流后我将 ...

  7. Java中的IO流,Input和Output的用法,字节流和字符流的区别

    Java中的IO流:就是内存与设备之间的输入和输出操作就成为IO操作,也就是IO流.内存中的数据持久化到设备上-------->输出(Output).把 硬盘上的数据读取到内存中,这种操作 成为 ...

  8. Java中的IO流(五)

    上一篇<Java中的IO流(四)>记录了一下Properties类,此类不属于IO流,它属于集合框架.接下来说一下IO流中的其它流 一,打印流PrintStream PrintStream ...

  9. Java中的IO流(六)

    上一篇<Java中的IO流(五)>把流中的打印流PrintStream,PrintWriter,序列流SequenceInputStream以及结合之前所记录的知识点完成了文件的切割与文件 ...

随机推荐

  1. nyoj 211 Cow Contest

    题目链接:http://acm.nyist.net/JudgeOnline/problem.php?pid=211 思路:我的思路是对每一个点,向上广搜,向下广搜,看总共能不能搜到n-1个结点,能,表 ...

  2. 在VMware上安装CentOS-6.5 minimal - 配置网络

    CentOS的minimal版本默认不启动网络,所以安装完CentOS要自己配置网络. 老伯的VMware虚拟机网络连接方式采用NAT方式(其他方式没试过). 1 修改配置文件/etc/sysconf ...

  3. [转]Try Cloud Messaging for Android

    本文转自:https://developers.google.com/cloud-messaging/android/start

  4. PHP采集程序中的常用函数

  5. UVA-10269 (floyd+dijkstra)

    题意: 现在有A个村庄,B个城堡,现在要从1到A+B,有M条路,魔法鞋最多能用K次,每次的长度不超过L,且起点和终点一定是村庄和城堡,而且每次使用魔法鞋不能穿过城堡,问最短时间是多少; 思路: 先用F ...

  6. HDU 4777 Rabbit Kingdom --容斥原理+树状数组

    题意: 给一个数的序列,询问一些区间,问区间内与区间其他所有的数都互质的数有多少个. 解法: 直接搞有点难, 所谓正难则反,我们求区间内与其他随便某个数不互质的数有多少个,然后区间长度减去它就是答案了 ...

  7. 在Android Studio中使用shareSDK进行社会化分享(图文教程)

    [声明] 欢迎转载,但请保留文章原始出处→_→ 生命壹号:http://www.cnblogs.com/smyhvae/ 文章来源:http://www.cnblogs.com/smyhvae/p/4 ...

  8. JavaWeb学习之Servlet(二)----Servlet的生命周期、继承结构、修改Servlet模板

    [声明] 欢迎转载,但请保留文章原始出处→_→ 文章来源:http://www.cnblogs.com/smyhvae/p/4140466.html 一.http协议回顾: 在上一篇文章中:JavaW ...

  9. ArcGis 获取地理、平面坐标系

                                         ESRI.ArcGIS.Geometry.ISpatialReference spatialReference = spati ...

  10. 浅析C#深拷贝与浅拷贝(转)

    1.深拷贝与浅拷贝   拷贝即是通常所说的复制(Copy)或克隆(Clone),对象的拷贝也就是从现有对象复制一个“一模一样”的新对象出来.虽然都是复制对象,但是不同的 复制方法,复制出来的新对象却并 ...