IO流的介绍(一)

IO流的介绍(一)

  1. 什么是IO流

    对任何程序设计语言而言,输入输出(Input/Output)系统都是非常核心的功能。

    • 输入(Input):就是将外部的数据读取到程序当中(以程序为基准,核心含义是“读”);如读取硬盘的文件到程序;读取网络上某个位置内容到程序;读取数据库系统的数据到程序;读取某些硬件系统到程序。

    • 输出(Output):在处理数据时,需要将数据写到外部(以程序为基准,核心含义是“写”);如将数据写到硬盘中;将数据写到数据库系统中;将数据写到某些硬件系统中。

    • java.io包为我们提供了相关的API,实现了所有外部系统的输入输出操作,这就我们这章要学的技术。

  2. 数据源

    数据源Data Source,提供数据的原始媒介。常见的数据源有:数据库、文件、其他程序、内存、网络连接、IO设备。

    数据源分为:源设备、目标设备

    • 源设备:为程序提供数据,一般对应出入流。
    • 目标设备:程序数据的目的地,一般对应输出流。

在这里插入图片描述

  1. 流的概念

    流是一个抽象、动态的概念,是一连串连续动态的数据集合。

    • 对于输入流而言,数据源就像水箱,流(Stream)就像水管中流动着的水流,程序就是我们的最终用户。我们通过流将数据源的数据输送到程序当中

    • 对于输出流而言,目标数据源就是目的地,我们通过流将程序中的数据输送到目的地数据源中。

在这里插入图片描述

  1. java中四大IO抽象类

    InputStream/OutputStream和Reader/Writer类是所有IO流的抽象父类。

    • InputStream:此抽象类是表示字节输入流的所有父类。InputStream是一个抽象类,他不可以实例化。数据的读取需要由它的子类实现。
      • 常用方法:
      • int read():读取一个字节的数据,并将字节的值作为int类型返回(0-255之间的一个值),如果为读出字节则返回-1(返回值为-1表示读取结束)
      • void close():关闭输入流对象,释放相关系统资源
    • OutputStream:此抽象类是表示字节输出流的所有类父类。输出流接收输出字节并将这些字节送到某个目的地。
      • 常用方法:
      • void write(int n):向目的地中写入一个字节
      • void close():关闭输出流对象,释放相关系统资源
    • Reader:用于读取的字符流抽象类,数据单位为字符。
      • 常用方法:
      • int read():读取一个字符的数据,并将字节的值作为int类型返回(0-65535之间的一个值,Unicode),如果为读出字节则返回-1(返回值为-1表示读取结束)。
      • void close():关闭流对象,释放相关系统资源
    • Writer:用于输出的字符流抽象类,数据单位为字符。
      • 常用方法:
      • void write(int n):向输出流写入一个字符
      • void close():关闭输出流对象,释放相关系统资源
  2. Java中流的概念细分

    按流的方向细分类

    • 输入流:数据流从数据源到程序(以InputStream、Reader结尾的流)

    • 输出流:数据流从程序到目的地(以OutputStream、Writer结尾的流)

在这里插入图片描述

按处理的数据单元分类

  • 字节流:以字节为单位获取数据,命名上以Stream结尾的流一般是字节流,如FileIInputStream、FileIOutputStream。
  • 字符流:以字符为单位获取获取数据,命名上以Reader/Writer结尾的流一般都是字符流,如FileReader、FileWriter。

按处理对象不同分类

  • 节点流:可以直接从数据源或目的地读写数据,如FileInputStream、FileReader、DataInputStream等

  • 处理流不直接连接到数据源或目的地,是"处理流的流"。通过对其他流的处理处理提高程序的性能,如BufferedInputStream、BufferedReader等。处理流也叫包装流。

在这里插入图片描述

  1. Java中IO流的体系

    java为我们提供了多种多样的流,我们可以根据不同的功能及性能要求挑选合适的IO流。

    下图为Java中IO流的体系(这里只列出常用的相关类,详情可以参考JDK API文档)

在这里插入图片描述

从上图发现,很多流都是成对出现的,比如:FileInputStream/FileOutputStream,显然是对文件做输入和输出操作的,我们做个简单的总结:

  • InputStream/OutputStream:

    字节流的抽象类

  • Reader/Writer

    字符流的抽象类

  • FileIInputStream、FileIOutputStream

    节点流:以字节为单位直接操作"文件"

  • ByteArrayInputStream/ByteArrayOutputStream

    节点流:是以字节为单位直接操作"字节数组对象"

  • ObjectInputStream/ObjectOutputStream

    处理流:以字节为单位直接操作"对象"

  • DataInputStream/DataOutputStream

    处理流:以字节为单位直接操作"基本数据类型与字符串类型"

  • FileReader/FileWriter

    节点流:以字符为单位直接操作"文本文件"(注意:只能读写文本文件)

  • BufferedReader/BufferedWriter

    处理流:将Reader/Writer对象进行包装,增加缓存功能,提高读写效率

  • BufferedInputStream/BufferedOutputStream

    处理流:将InputStream/OutputStream对象进行包装,增加缓存功能,提高读写效率

  • InputStreamReader/OutputStreamWriter

    处理流:将字节流对象转换成字符流对象

  • PrintStream

    处理流:将OutputStream进行包装,可以方便地输出字符,更加的灵活。

猜你喜欢

转载自blog.csdn.net/Xun_independent/article/details/114803602