zoukankan      html  css  js  c++  java
  • IO流

    本文原创,转载请标明原处!

    流分输入流输出流,其基本操作分别是读取和写入。

    流分字节流和字符流,其操作数据分别是字节和字符。

    字节流的基类:InputStreamOutputStream

    字符流的基类:ReaderWriter

    流分源头流和非源头流(嵌套流),其区别在于该流是否可以独立使用,源头流是可以独立使用的流,而非源头流是需要有源头流才能使用。下图表示出了有那些源头流。

    如何认识这些流,个人觉得分六个方面认识:源头所需性能优化操作强化数据过滤多源控制状态记录

    源头所需而存在的流有:

    • ByteArray + InputStream/OutputStream
    • CharArray + Reader/Writer
    • String + Reader/Writer
    • File + Reader/Writer
    • Piped + InputStream/OutputStream/Reader/Writer

    性能优化的流主要是缓存,拥有缓存的流有:

    • Buffered + InputStream/OutputStream/Reader/Writer
    • LineNumberReader
    • PrintWriter(注:该类可以直接使用流或文件名构造,构造的时候,会创建BufferedWriter,因此会带有缓存功能。如果使用Writer构造,就不会带有缓存功能了,因此职责单一有利于记忆和阅读,否则会造成阅读混乱,建议使用Writer参数的构造。)

    操作强化是指在基本操作的基础上,增加了可以直接读取或写入实际数据的类型,拥有操作强化的流有:

    • Buffered + Reader/Writer
    • Print + Stream/Writer
    • Data + InputStream/OutputStream
    • Object + InputStream/OutputStream

    数据过滤是指数据从一端流向另一端的过程中进行转换,统计,添加,删减,装饰等操作,数据过滤的流有:

    • InputStreamReader:把字节转化为字符的流。
    • OuputStreamWriter:把字符转化为字节的流。
    • File + Reader/Writer:字节与字符间的转换。
    • LineNumberReader:累计换行符的次数,即可以获取或改变当前操作的行号。

    多源控制是指流不止一个数据源,一般多源是输入流才有这样的需求,拥有多源的流有:

    • SequenceInputStream:从第一个源开始读取,当读取完毕时,再向第二个源读取,以此顺序读取。
    • Pushback + InputStream/Reader:流一般是单向,不可逆。此流虽然可逆,但只是流向他自身的一个逆缓存。读取操作时,需要先把逆缓存的数据读取完毕,才能正式读取源。

    流的基类里都带有状态记录所需的方法,分别是:markSupported,mark和reset。但并不是所有流都支持状态记录,markSupported返回布尔值就是告诉操作者,该流是否支持状态记录。

    一般拥有缓存的流都支持状态记录,而部份非源头流是否支持是依赖于其源的支持。缓存流会把开始记录的数据一直存放在缓存里面,直到缓存数据的长度超出一个数值,这个数值是在调用方法mark时,传入的一个int数值,超出之后就无法回档。调用reset方法,就是把状态回档,使流从记录地方开使操作。

    Filter + InputStream/OutputStream/Reader/Writer,这个流是提供给用户自定义流的模板,实现了其状态记录的支持是依赖于源。

    相关:

    网络输入输出,通过socket对象可以获取其输入流getInputStream()与输出流getOutputStream()。

    控制台输入输出,通过System.in,System.out,System.err获取。虽然这三个对象的变量被声明为final,但可以通过System.setIn(...),System.setOut(...),System.setErr(...)方法改变。

    扫描器类Scanner,这个类是继承于遍历器类Iterator<String>,并不是流,但可以使用流来创建,提供更为强大的读取能力。例如可以读取大整数BigInteger,大浮点数BigDecimal,字符串模式匹配等。

    待续更新!

  • 相关阅读:
    一天搞懂深度学习--深度学习简介
    Ubuntu16.04下安装Hive
    Ubuntu16.04下安装Hadoop
    Hive入门学习--HIve简介
    循环神经网络(RNN)--学习笔记
    如何使用GitHub
    python pandas import 失败
    Azure ARM VM内部关机了,但门户却显示虚拟机还在处在“正在运行”的状态
    Exchange 2010 与 RMS(集成权限管理服务)集成
    统计 Exchange 2010 时间段收发邮件总量
  • 原文地址:https://www.cnblogs.com/hvicen/p/6127283.html
Copyright © 2011-2022 走看看