1. 流的概念:

1) Java把所有设备中的有序数据抽象成流,而流(stream)就是指从源节点到目的节点的有序数据,而这里的节点就是存储节点;

2) 而上述只是一种对Java的流的一种描述性概括,这里给出Java中流的严格定义:

i. 流是存储节点上的有序数据;

ii. 流必然要从某个源节点流向某个目的节点,即流具有动态的特性(流动性);

iii. 流必定是从静态数据转换而来的:即原本数据是静态的保存在存储节点中的,而一旦要将其从一个节点传到另一个节点就必须先将这样的静态数据转换成动态的流才行!

iv. 节点上原来的静态数据就叫做节点数据,一旦转换成流之后就叫做节点上的流,简称节点流,而存在流的节点就叫做流节点;

3) 因此一个完整的流的生命周期是这样的:静态的节点数据   --(转换)-->   动态的节点流(源节点)   --(流向目标节点)-->   节点流(目标节点)  --(转换)-->   静态节点数据   --(进行进一步处理)-->   ...

2. 流的分类:

1) 输入输出流:

i. 输入流:只能从流中读取数据到程序中;

ii. 输出流:只能从程序中写数据到流中;

iii. 因此输入输出流只是一种方向问题,如果两个程序通信,A向B传输局,那么A中使用的输出流,而该流留到B后B要从流中读取数据,因此该流在B中就是输入流了,因此这是相对的;

iv. Java以InputStream和Reader作为输入流的基类,以OutputStream和Writer作为输出流的基类,只不过InputStream和OutputStream处理的是字节流,而Reader和Writer处理的是字符流;

2) 字节流和字符流:

i. 两者处理的数据不同,但是用法几乎完全相同;

ii. 字节流以8bit的字节作为数据单元,而字符流以16bit的字符(Java使用Unicode,2字节表示一个字符)作为数据单位;

iii. InputStream和OutputStream就是字节流,而Reader和Writer是字符流;

3) 节点流:

i. 节点流前面已经讲过了,就是存储节点上的待传输的有序数据,它是直接和存储节点相关的,节点流对象的很多方法都是直接操作存储节点的硬件驱动,不同节点流所包含的方法不尽相同,比较繁琐,因此节点流是一种低级流;

ii. Java中的存储节点:

a. Java几乎将一切可以存放静态数据的东西都抽象成节点(存储节点);

b. 最常见的流如:文件(File对象,代表磁盘设备)、套接字(Socket对象,代表一个网络节点)等;

c. 特殊的如:数组、StringBuffer等可以存储可修改字符的字符串等,毕竟虽然它们不是什么眼睛就能看到的存储设备,但是它们同样可以保存静态数据,因此也可以将它们作为存储节点,还可以将它们保存的数据转换成流;

!!为啥要将数组、字符串等作为节点呢?其实在C语言中就已经接触过了,比如sprintf格式化一个字符串,不就是将该字符串先转化成一个输出流,然后将格式字符输出到该字符串当中以形成一个新字符串的吗?

iii. 常见的节点流:

a. 节点流都是跟具体的存储节点相关的,因此其类名中往往包含存储节点的名字;

b. 比如常见的FileInputStream就是文件节点流(输入流),可以将一个文件转换成输入流,然后在程序里从输入流中读取文件的数据;

c. 特殊的如CharArrayReader就是一个字符数组节点流(输入流),可以将一个字符数组转换成输入流,然后在程序里从输入流中读取数组中的字符;

!!小结:

a. 节点流很底层,直接和存储节点相关,因此是一种低级流;

b. Java的节点流类型都是以节点名称作为前缀,然后以InputStream、OuputStream、Reader、Writer作为后缀,即名称中必然包含存储节点;

c. 既然和节点相关,那么其对象方法也是和节点相关的(包含节点的驱动),因此不同节点流的对象方法不尽相同,差异较大;

4) 处理流:

i. 和节点流刚好对应,处理流是一种高级流;

!节点流是驱动层级的低级流,而处理流是一种应用层级的高级流;

ii. 处理流用来将已存在的节点流进行包装,然后用统一的方式进行流操作,这样就可以隐藏底层各个节点流的差异了;

iii. 比如两个节点流FileOutputStream和ByteArraryOutputStream进行流操作的对象不放不尽相同,可以完成同一个目标两者调用的方法可能不同(甚至调用方法的数量、参数都不同),但是都经过高级处理流PrintStream包装,那么包装后得到的PrintStream对象可以用统一的方法完成两者要完成的任务,并且调用的方法更简单高效!

iv. 这就是Java设计I/O体系是的良苦用心了:

a. 这是一种装饰器设计,处理流也称为包装流,即用处理流来包装(装饰)不同的节点流;

b. 比如用同一个处理流PrintStream来包装文件节点流、Socket节点流、打印机节点流、数组节点流、键盘/显示屏的标准节点流等等,然后用一套统一的方法完成对这些节点的输入输出工作,这让编程变得异常简单!!

c. 毕竟存储节点实在是太多了(多种多样),其节点流API也必然是五花八门,程序员真心无法背出那么多API,那么干脆就用处理流包装它们,然后用一套统一的API进行操作,因此最多也只需要背一套处理流的API就行了;

d. 具体来讲,如果要往输出流中插入一行数据,那么文件节点流可能需要两个方法来完成,Socket节点流可能需要一个方法完成,而前者的方法参数可能有3个,而后者可能有5个,差异非常大,背起来很麻烦,但是如果都包装秤PrintStream了话,就直接调用一个println方法就行了!很方便不是码?

!!并且,标准I/O(即键盘/屏幕)中的输出流用的就是PrintStream,也就是我们常用的System.out,你想想,System.out你用的多频繁,一定很熟悉吧,那么现在你往文件、Socket、打印机、数组等节点里面输出数据也就跟System.out一样,那不是很开心吗??

v. 常见的处理流:PrintStream(不用讲了,System.out、网络编程中经常用到)、BufferedReader(可以使输入流一行一行地读取)等等;

3. 创建节点流和处理流:

1) 创建节点流:

i. 很简单,必须要先准备好节点,然后再用其构造成相应的节点流,使用节点流的构造器构造;

ii. 构造器的格式:Xxx节点流(节点对象 | 结点名称);

iii. 示例:

a. FileInputStream(File file);  // 直接用节点对象来构造

!!File就是Xxx,即节点类型的名称,而InputStream就是具体的流,这里是字节输入流,当然也可以是OutputStream、Reader、Writer

b. FileInputStream(String name);  // 就用结点的名称来构造

2) 创建处理流:

i. 也很简单,上面讲过,精髓就是包装!因此必须先准备好一个低级节点流让其包装(使用处理流的构造器包装);

ii. 构造器格式:Xxx处理流(节点流对象);

iii. 示例:

a. PrintStream(OutputStream out);  // OutputStream是所有字节输出流的基类,因此这里是向上转换,传节点流即可

b. BufferedReader(Reader in);  // 同样Reader是所有字符输入流的基类,因此也是向上转换,传节点流即可

c. PrintStream ps = new PrintStream(new FileOutputStream("test.txt"));

d. BufferedReader br = new BufferedReader(new InputStreamReader(System.in)); // System.in是字节流,先要转化成字符流才行,InputStreamReader就是将字节流转化成字符流

[疯狂Java]I/O:流模型(I/O流、字节/字符流、节点/处理流)相关推荐

  1. 【Java10】lambda表达式(函数式编程),Stream流,File类,字节/字符流,乱码,缓冲/转换/序列化/打印流,Properties

    文章目录 1.lambda表达式标准语法:()->{} 2.lambda表达式简略语法:可推导即可省略 3.lambda表达式原理:lambda效率比匿名内部类高 4.两个函数式接口:Consu ...

  2. Java基础巩固(二)异常,多线程,线程池,IO流,Properties集合,IO工具类,字符流,对象流,Stream,Lambda表达式

    一.异常,多线程 学习目标 : 异常的概述 异常的分类 异常的处理方式 自定义异常 多线程入门 1 异常的概述 1.1 什么是异常? 异常就是程序出现了不正常情况 , 程序在执行过程中 , 数据导致程 ...

  3. 高斯羽流模型的简明原理以及python代码实现(针对卫星监测的气体点源排放建模)

    高斯羽流模型 高斯羽流模型(Gaussian Plume Model)是被广泛用来描述在静稳大气中点源排放的气体浓度分布的模型 对于满足以下四点的的大气污染物排放,高斯羽流模型可以较为便捷地估算出排放 ...

  4. Java-IO流(File操作,字符输入输出流,字节输入输出流,缓冲流,对象流)

    File对象 File的介绍 File 类 就是当前系统中 文件或者文件夹的抽象表示      通俗的讲  就是 使用File对象 来操作我们电脑系统中的文件或者文件夹 学习File类 其实就是学习 ...

  5. java疯狂讲义输入输出视频_疯狂JAVA讲义---第十五章:输入输出(上)流的处理和文件...

    在Java中,把这些不同类型的输入.输出抽象为流(Stream),而其中输入或输出的数据称为数据流(Data Stream),用统一的接口来表示,从而使程序设计简单明了. 首先我要声明下:所谓的输入输 ...

  6. 疯狂Java面试题大全(Android版)

    疯狂Java面试题大全(Android版) 本大全每个月会定期更新,索取网址:http://www.fkjava.org Java核心技术部分 Java核心技术部分的面试题,可能覆盖Java基本语法. ...

  7. 疯狂Java和Android面试题大全(Android版)

    疯狂Java和Android面试题大全(Android版) 本大全每个月会定期更新,索取网址:http://www.fkjava.org Java核心技术部分 Java核心技术部分的面试题,可能覆盖J ...

  8. 疯狂JAVA讲义---第十二章:Swing编程(五)进度条和滑动条

    http://blog.csdn.net/terryzero/article/details/3797782 疯狂JAVA讲义---第十二章:Swing编程(五)进度条和滑动条 标签: swing编程 ...

  9. Java NIO学习系列六:Java中的IO模型

    前文中我们总结了linux系统中的5中IO模型,并且着重介绍了其中的4种IO模型: 阻塞I/O(blocking IO) 非阻塞I/O(nonblocking IO) I/O多路复用(IO multi ...

  10. java关键字 valotile_Java内存模型-jsr133规范介绍,java中volatile关键字的含义

    最近在看<深入理解Java虚拟机:JVM高级特性与最佳实践>讲到了线程相关的细节知识,里面讲述了关于java内存模型,也就是jsr 133定义的规范. 系统的看了jsr 133规范的前面几 ...

最新文章

  1. 后处理程序文件大小的变量_【每日一题】(17题)面试官问:JS中事件流,事件处理程序,事件对象的理解?...
  2. http://msdn.microsoft.com/zh-cn/library/system.web.ui.webcontrols.gridview.rowediting.aspx
  3. 我的Delphi开发经验谈(转)
  4. [数据结构]顺序单链表插入
  5. body 没有被撑开_body没有高度设置背景色为什么可以全屏显示?
  6. java ejb项目_Maven创建EJB项目结构
  7. 事务回退机制 android,【Android基础】——Fragment-使用方法
  8. Mac怎么连接多个蓝牙音箱?
  9. 微信小程序做出 物流签收信息(步骤条) 源码
  10. 银行考试计算机也需要考金融知识吗,银行招聘考试科技岗考试科目及考试内容...
  11. 彻底关闭win10的自动更新
  12. B样条曲线与曲面相关知识点汇总
  13. python裁剪不规则区域_Python实现不规则图形填充的思路
  14. 中国香水市场深度调查研究报告
  15. JXLS生成excel填充图片设置大小
  16. CS61A 2022 fall lab01
  17. MacBook上如何运行那些尚未在Mac App Store 上架的 iOS/iPadOS 应用程序分享
  18. 在Windows中初次安装VS Code详细过程及初始化
  19. mysql oracle as_ORACLE WITH AS 用法
  20. 20220519_缓冲字符流

热门文章

  1. poj2816-红与黑-C语言-递归算法入门
  2. 游戏引擎架构-学习笔记
  3. ROS(RouterOS)实现一线多拨+负载均衡(多图)
  4. 整数有约 | 非夕科技:用自适应机器人,做通用智能时代的硬核引领者
  5. 恭贺德林教点穴网成立
  6. 飞机客运售票系统oracle分析,民航机场售票管理系统.doc
  7. flutter app使用大量网络图片导致频繁崩溃
  8. hotmail手机端_Hotmail邮箱客户端下载-Hotmail手机版下载 v2.48.0-pc6下载
  9. matlab如何绘制语谱图,语谱图matlab
  10. CryEngine5官方 window下源码编译