【Java IO】初识字节流和字符流

亡梦爱人 提交于 2019-11-27 17:24:40

        说到IO,在我们工作中是经常遇到的,比如文件的上传、网络的数据传输、系统的日志记录等,俯拾皆是。Java里面是怎么实现IO的,今天我们一起学习下。

        Java种IO是通过流的方式实现的,流可以理解为一个序列的数据,Java中定义了字节流和字符流,字节流顾名思义它处理的基本单位就是字节,字符流处理的基本单元是Unicode码元(1字符=2字节),String类型叫做字符串,字符串在内存里也是Unicode的码元。流还有另外一种分类方法,就是输入流和输出流,把对象(文件、图片等)读入程序中需要用输入流,程序中需要写入文件时需要用输出流,这只是一个方向的问题。下面做下简单整理:

  • 按照处理的基本单元分类:
  1. 字节流:处理单元为字节
  2. 字符流:处理单元为Unicode码元
  • 按照读取、写入的流的方向分类:
  1. 输入流:可以理解问将文件读取到程序中的流
  2. 输出流:可以理解为从程序中写入到文件中的流

        JDK中java.io包下是关于io操作的类。按照上面的分类,看下都有哪些类,下图是我收藏的一张关于JDK中IO部分的分类:

1. 字符流

  • Reader:Reader是一个抽象类,它实现了Readable、Closeable接口,它的子类有以下几类:

        StringReader、CharArrayReader是主要的介质类,分别从String和Char数组中读取数据;

        PipedReader是一个管道流,是从与其他线程共用的管道中读取数据;

        BufferedReader是一个装饰器类(如果对装饰者模式不熟悉的,可以查看我的设计模式篇中的装饰者模式的介绍),

        FilterReader是个抽象类,他是PushbackReader类的父类。

        InputStreamReader是连接字符流和字节流的桥梁,它可以将字节流转换为字符流。FileReader就是它的一个子类,实现了将文件的输入字节流转换为输入字符流的功能。

  • Writer:是所有输出流的父类,是一个抽象类,它实现了Apenderable、Closeable和Flushable接口

        CharArrayWriter、StringWriter是两种基本的介质流,分别面向Char数组、String写入数据。

        PipedWriter是一个管道输出流,向与其他共用的管道中写入数据

        BufferedWriter是一个装饰器类,为Writer子类提供缓冲功能。

        OutputStreamWriter是OutputStream到Writer转换的桥梁,FileWriter是它的子类,实现了将文件输出字节流转换为输出字符流的功能。

2. 字节流

  • 输入字节流InputStream ,是所有字节输入流的父类,是一个抽象类,实现了Closeable接口

        FileInputStream、StringBufferInputStream、ByteArrayInputStream是字节输入流的三个介质类,分别从本地文件、String缓冲区、Byte数组中读取数据;其中的StringBufferInput已经不再建议使用了

        FilterInputStream是装饰器类的父类,下面有BufferedInputStream、DataInputStream、PushbackInputStream

        ObjectInpuStream、SequenceInputStream都是装饰器类

        PipedInputStream是一个管道字节流, 是从与其它线程共用的管道中读取数据

  • 输出字节流OutputStream,是所有字节输出流的父类,是一个抽象类,实现了Closeable、Flushable接口

        FileOutputStream、ByteArrayOutputStream是两个基本的介质流类,分别向本地文件、byte数组写入数据。PipedOutputStream是向与其他线程共用的管道中写入数据。

        ObjectOutputStream及FilterOutputStream的子类都是装饰器类。

3. 字节流和字符流的使用场景

        JDK早期版本中就提供了字节流和字符流的两种处理方式,字符流的处理单位是码元,效率比字节要高一些,但是并不代表字符流就比字节流具有优势。比如常见的图片,因为它的编码格式和常规的字符编码格式不一致,所以字符流对于图片这类文件就显者束手无策了。字节流和字符流各具优势,不能互相代替。

        这一篇,对IO部分有了初步的认识,下篇将介绍IO的发展史,什么是BIO、NIO、AIO。欢迎关注。

标签
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!