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

转载于:https://www.cnblogs.com/baiduligang/p/4247454.html

第15章-输入/输出 --- 理解Java的IO流相关推荐

  1. java的输出流包括_【转】输入/输出流 - 深入理解Java中的流 (Stream)

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

  2. 黑书《现代操作系统(中文第三版)》课后习题——第五章 输入/输出

    第五章 输入/输出 1.芯片技术的进展已经使得将整个控制器包括所有总线访问逻辑放在一个便宜的芯片上成为可能.这对于图1-5的模型具有什么影响? 答:(题目有问题,应该是图1-6)在此图中,一个控制器有 ...

  3. Java中IO流,输入输出流概述与总结(转载自别先生文章)

    Java中IO流,输入输出流概述与总结 总结的很粗糙,以后时间富裕了好好修改一下. 1:Java语言定义了许多类专门负责各种方式的输入或者输出,这些类都被放在java.io包中.其中, 所有输入流类都 ...

  4. java 中的流_深入理解Java中的流(Stream)

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

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

    个人小站,正在持续整理中,欢迎访问:http://shitouer.cn 小站博文地址:深入理解 Java中的 流(Stream)机制 最近在看<Hadoop:The Definitive Gu ...

  6. Java基础—IO流

    第一讲   IO概述 1. 流的概念 IO流即InputOutput的缩写,在Java中IO流用来处理设备之间的数据传输,Java对数据的操作是通过IO流的方式, 我们可以把IO流抽象的当作一根管道, ...

  7. java数据通道抽象为流_【java】IO流

    对于java的IO流的理解很长时间来都是很乱,包括学习其他的语言对这一块知识也都算是一个盲点.更多的时候一提到读取保存数据就是使用数据库.这一次学习了IO流,自己又解决了一个很大的盲点. IO流为我们 ...

  8. 黑马程序员-JAVA基础-IO流之字符流和字符流缓冲区

    ------- android培训.java培训.期待与您交流!------- Java 的IO 流 是实现输入和输出的基础,Java 中把不同的输入.输出源抽象表述为"流" (S ...

  9. java基础 io流 字节流 字符流 节点流 包装流 转换流 缓冲流 对象流 打印流 Properties类

    目录 1.概念 2.常用的文件操作 2.1 创建文件 2.2 获取文件相关信息 2.3 目录的操作和文件删除 3. IO流原理及流的分类 3.1 流的分类 4.InputStream 字节输入流 4. ...

最新文章

  1. 区块链将重新定义世界
  2. 实时监控用户输入--中文输入解决方案
  3. iOS 取四舍五入取平均值
  4. 4G EPS 中建立 eNB 与 MME 之间的 S1 连接
  5. php每天扒取当天新闻_php 抓取新浪新闻的程序代码
  6. Guru of the Week 条款01: 变量的初始化
  7. 企业要顺应社会生态环境
  8. hbase组合rowkey_「从零单排HBase 11」HBase二级索引解决方案
  9. (草稿)如何判断一名UiPath开发人员是否合格?
  10. 类如何调用自己的私有成员_企业如何快速获取自己的私有领域流量?
  11. 【手撸一个ORM】第八步、查询工具类
  12. HoloLens开发手记 - Unity之语音输入
  13. 赢在微点答案专区英语_自考英语二太难?看了墨盒的单词本,保你信心满满去考试!...
  14. 键帽图纸_如何更换机械键盘的键帽(以便它可以永远存在)
  15. 跨境电商亚马逊产品运营模式都有哪些
  16. matlab图像处理(图像)
  17. 今年的情人节,给心爱的她一个不一样的礼物吧
  18. Python:实现测试信用卡号码有效性credit card validator的算法(附完整源码)
  19. 能力不够,你就态度好点
  20. 关于python安装问题 0x80072f7d的解决方法

热门文章

  1. spring实战六之使用基于java配置的Spring
  2. poj 3984 迷宫问题 BFS
  3. 把有限的精力放在最有意义的事上
  4. 利用Python中的numpy.ndarray.reshape()对阵列形状进行调整
  5. 对语句 cv::Point2f srcPoint[3];的理解~
  6. df、du、fdisk、lsblk区别
  7. redis 集群搭建_一文轻松搞懂redis集群原理及搭建与使用
  8. 流式处理框架storm浅析(下篇)
  9. ios 自定义加载动画效果
  10. 使用plsql连接远程oracle数据库配置