• [02] 输入/输出流 和 字节/字符流



    1、输入流和输出流

    我们在提到File类的时候,就说过Java对于输入和输出操作是以 “流” 的形式来体现的,另外,所谓的输入和输出是针对内存来讲的,根据数据的传输方向,往内存中读,叫输入流;从内存中往外写,叫输出流。


    上面这张图应该很形象了,接下来要说的是:
    • 所有输入流都是InputStream类或Reader类的子类
      • 类名以InputStream结尾的类都是InputStream类的子类
      • 类名以Reader结尾的类都是Reader类的子类
    • 所有输出流都是OutputStream类或Writer类的子类
      • 类名以OutputStream结尾的类都是OutputStream类的子类
      • 类名以Writer结尾的类都是Writer类的子类
     
    可以从java.io包里的类来感受一下这个概念:
     

    2、字节流和字符流 

    同样作为输入或者输出的流类,为什么会有形如InputStream和Reader两种类呢?因为它们在数据流的编码格式上有进一步的划分:
    • InputStream / OutputStream 子类都是字节流
      • 读写二进制文件,主要处理音频、图片、歌曲等
      • 处理单元为1个字节 1byte
    • Reader / Writer 子类都是字符流
      • 处理字符或字符串
      • 处理单元为2个字节 2byte
      • 字符流将读取到的字符数据,去指定的编码表中获取对应文字
     
    计算机内数据操作最小单元就是byte(位操作不算在内),所以对于图片音频等,处理单元为1个字节;而字符类处理单元为1个字符char,即2个byte。

    (题外话:我们说脱离编码谈字符是没有意义的,同一个汉字不同编码下可能所占字节数完全不同,实际上Java的char本质上是UTF-16编码,若某个抽象字符在UTF-16下占4个字节,实际上还是无法放入char的)

    字节流中常用类
    • 字节输入流 FileInputStream
    • 字节输出流 FileOutputStream

    字符流中常用类
    • 字符输入流 FileReader
    • 字符输出流 FileWriter
     
    另,为了方便操作,字节流可以转换为字符流,以更高效地处理字符数据:
    • InputStreamReader(InputStream in)
    • InputStreamReader(InputStream in, String charsetName)
    • OutputStreamWriter(OutputStream out)
    • OutputStreamWriter(OutputStream out, String charsetName)

    读入字节,并根据指定的编码方式,将之转换为字符流。编码方式可以由名称指定,或平台可接受的缺省编码方式。


  • 相关阅读:
    Swift
    Swift
    Swift
    Swift
    Swift
    Swift
    Swift
    Swift
    Swift
    算法の序列
  • 原文地址:https://www.cnblogs.com/deng-cc/p/7462322.html
Copyright © 2020-2023  润新知