[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)

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


原文地址:https://www.cnblogs.com/deng-cc/p/7462322.html