(一)理解Java的IO流

    JAVA的IO流是实现输入/输出的基础,它可以方便地实现数据的输入/输出操作,在Java中把不同的输入/输出(键盘、文件、网络连接等)抽象表述为"流"(Stream),通过流的方式允许Java程序使用相同的方式来访问不同的输入/输出源。

    Stream是从起源(source)到接收(sink)的有序数据

(二)流的分类

    1.输入流和输出流

      按照流的流向来分,可以分为输入流和输出流:

      a.  输入流:只能从中读取数据,而不能向其写入数据。

      b.  输出流:只能向其写入数据,而不能从中读取数据。

    此处的输入、输出涉及一个方向问题,如下图所示的数据流向:数据从内存到硬盘,通常称为输出流--也就是说,这里的输入、输出都是从程序运行所在内存的角度来划分的。

     

  对于下面所示的数据流向,数据从服务器通过网络流向客户端,在这种情况下,Server端的内存负责将数据输出到网络里,因此Server端的程序使用输出流;Client端的内存负责从网络里读取数据,因此Client端的程序应该使用输入流。

    

    2.字节流和字符流

    字节流和字符流的用法几乎完全一样,区别在于字节流和字符流所操作的数据单元不同--字节流操作的数据单元是8位字节,而字符流操作的数据单元是16位的字符

    字节流主要有InputStream和OutputStream作为基类,而字符流则组要由Reader和Writer作为基类。

    3.节点流和处理流

    按照流的角色来分,可以分为节点流和处理流:

    可以从/从一个特定的IO设备(如磁盘、网络)读/写数据的流,称为节点流,节点流也被称为低级流(Low Level Stream)。

    下图显示了节点流示意图:

    

    从上图可以看出,当使用节点流进行输入/输出时,程序直接连接到实际的数据源,和时间的输入/输出节点连接。

      处理流则用于对一个已存在的流进行连接或封装,通过封装后的流来实现数据读/写功能,处理流也被称为高级流。

    下图显示了处理流示意图:

      

    从上图可以看出,当使用处理流进行输入/输出时,程序并不会直接连接到实际的数据源,没有和实际的输入/输出节点连接。使用处理流的一个明显好处是,只要使用相同的处理流,程序就可以采用完全相同的输入/输出代码来访问不同的数据源,随着处理流所包装节点流的变化,程序实际所访问的数据源也相应的发生变化。

(三)流的概念模型

      Java的IO流共涉及40多个类,这些类看上去很凌乱,但实际上非常规则,而且彼此之间存在非常紧密的联系。Java的IO流的40多个类都是从如下4个抽象类派生的:

    (1)InputStream/Reader:所有输入流的基类,前者是字节输入流,后者是字符输入流。

    (2)OutputStream/Writer:所有输出流的基类,前者是字节输出流,后者是字符输出流。

      对于InputStream和Reader而言,它们把输入设备抽象成一个"水管",这个水管里的每一个"水滴"一次排序:

     如下图:

      

    从上图可以看出,字节流和字符流的处理方式其实非常相似,只是它们处理的输入/输出单位不同而已。输入流使用隐式的记录指针来表示当前正准备从哪个"水滴"开始读取,每当程序从InputStream或Reader里取出一个或多个"水滴"后,记录指针自动向后移动;除此之外,InputStream和Reader里都提供了一些方法来控制记录指针的移动。

    对于OutputStream和Writer而言,它们同样把输出设备抽象成一个"水管",只是这个水管里没有任何水滴,如下图:

    

    如上图,当执行输出时,程序相当于依次把"水滴"放入到输出流的水管中,输出流同样采用隐式的记录指针来标识当前水滴即将放入的位置,每当程序向OutputStream或Writer里输出一个或多个水滴后,记录指针自动向后移动。

    上面两幅图显示了Java IO流的基本概念模型,除此之外,Java的处理流模型则体现了Java输入/输出流设计的灵活性。

    处理流的功能主要体现在以下两个方面:

    (1)性能的提高:主要以增加缓冲的方式来提供输入/输出的效率。

    (2)操作的便捷:处理流可能提供了一系列便捷的方法来一次输入/输出大批量的内容,而不是输入/输出一个或多个“水滴”。

第15章-输入/输出 --- 理解Java的IO流的更多相关文章

  1. 第15章-输入/输出 --- File类

    (一) Java的IO通过java.io包下的类和接口来支持,在java.io包下主要包括输入.输出两种IO流. 每种输入.输出流又分为字节流和字符流两大类: (1)字节流以字节为单位来处理输入.输出 ...

  2. 理解Java之IO流

    流是一种抽象概念,它代表了数据的无结构化传递.用来进行输入输出操作的流就称为IO流. 一.IO流结构 1.流的分类方式 按流向分: 从文件/网络/内存等(数据源)到程序是输入流:从程序到文件/网络/内 ...

  3. 【转】输入/输出流 - 深入理解Java中的流 (Stream)

    基于流的数据读写,太抽象了,什么叫基于流,什么是流?Hadoop是Java语言写的,所以想理解好Hadoop的Streaming Data Access,还得从Java流机制入手.流机制也是JAVA及 ...

  4. Linux就这个范儿 第15章 七种武器 linux 同步IO: sync、fsync与fdatasync Linux中的内存大页面huge page/large page David Cutler Linux读写内存数据的三种方式

    Linux就这个范儿 第15章 七种武器  linux 同步IO: sync.fsync与fdatasync   Linux中的内存大页面huge page/large page  David Cut ...

  5. 深入理解 Java中的 流 (Stream)

    首先,流是什么? 流是个抽象的概念.是对输入输出设备的抽象,Java程序中,对于数据的输入/输出操作都是以"流"的方式进行.设备能够是文件,网络,内存等. 流具有方向性,至于是输入 ...

  6. Java之IO流总结

    IO流·Java流式输入/输出原理·Java流类的分类·输入/输出流类·常见的节点流和处理流·文件流·缓冲流·转换流·数据流·Print流·Object流 ①Java流式输入/输出原理         ...

  7. java的IO流

    java的IO流继承四大抽象类分别是字节流 inputStream outputStream与字符流 read write.怎么理解记忆很重要. 直接连接读写对象的是结点流,例如对文件读取字节类的名字 ...

  8. Java基础——IO流

    今天刚刚看完java的io流操作,把主要的脉络看了一遍,不能保证以后使用时都能得心应手,但是最起码用到时知道有这么一个功能可以实现,下面对学习进行一下简单的总结: IO流主要用于硬板.内存.键盘等处理 ...

  9. Java中IO流的总结

    有关Java中IO流总结图 流分类 按方向分 输入流 输出流 按单位分 字节流 字符流 按功能分 节点流 处理流(过滤流) 其他 所有的流继承与这四类流:InputSteam.OutputStream ...

随机推荐

  1. linux qcom LCD framwork

    点击打开链接 0.关键字 MDSS : Multimedia Display sub system DSI: Display Serial Interface 1.涉及文件 (1) drivers\v ...

  2. AndroidManifest.xml中的application中的name属性

    被这个不起眼的属性折磨了一天,终于解决了. 由于项目需要,要合并两个android应用,于是拷代码,拷布局文件,拷values,所有的都搞定之后程序还是频频崩溃,一直没有找到原因,学android时间 ...

  3. android sdk里的各目录作用

    android sdk里的各目录作用 AVD Manager.exe:虚拟机管理工具,用于建立和管理虚拟机. SDK Manager.exe:sdk管理工具,用于管理.下载sdk.sdk工具,能及扩展 ...

  4. 【VSTS 日志】TFS 2015 Update 1 发布 – Git和TFVC代码库可以混合使用了

    Visual Studio Team Foundation Server 2015 Update 1已经发布了. 这是 Team Foundation Server (TFS) 的最新版本,是 Mic ...

  5. 1020. Tree Traversals (25) -BFS

    题目如下: Suppose that all the keys in a binary tree are distinct positive integers. Given the postorder ...

  6. mxgraph进阶(二)mxgraph的初步介绍与开发入门

    mxgraph的初步介绍与开发入门 前言 由于小论文实验需求,需要实现根据用户日志提取出行为序列,然后根据行为序列生成有向图的形式,并且连接相邻动作的弧上标有执行此次相邻动作的频次.为此,在大师兄徐凯 ...

  7. Linux 之归档与压缩

    首先我们思考一下,归档和解压是一个概念吗?答案很明显不是啊,所谓归档,就是将一些文件归到一起,并没有对其进行压缩的操作.然而压缩则不同,见名知意.下面我们就来深入的研究一下这两个知识点吧! ----- ...

  8. OC语言大总结(下)

    根据OC学习的知识点,总结了一下,希望能帮到大家! 作者:韩俊强   未经允许,请勿转载! 关注博主:http://weibo.com/hanjunqiang 上接:http://blog.sina. ...

  9. (六十二)纯代码搭建UI

    在Xcode6中,去掉了Empty Application的选项,因此可以通过先创建SingleView,再删除storyboard,并且把工程设置中的main Interface清空. 通过AppD ...

  10. 【翻译】Ext JS 4——Ajax和Rest代理处理服务器端一场和消息的方法

    原文:EXTJS4 - Handle Server-side exceptions and message from an Ajax or Rest proxy 作者:Raja 可能要处理的情况:su ...