• Java的I/O框架导读


    Java的I/O框架是提供系统输入和输出功能,主要是涉及文件,网络数据流,内存缓冲等的输入输出,网页端的输入和输出主要依靠J2EE的Servlet和HTTP,GUI的输入输出依靠Swing工程中的JFC (Java Foundation Classes) 类。

    Java IO框架结构

    Java I/O框架的主要关注的是从数据源读取数据写入到目标媒介:
    I/O过程

    当读取或写入数据时,Java设计了两种不同的方式,字节流和字符流, InputStream和OutputStream是字节的输入和输出,Reader和Writer是字符的输入和输出。

    Java I/O框架的主要应用场景:
    文件访问
    网络访问
    内存缓存访问
    线程内部通信(管道)
    缓冲
    过滤
    解析
    读写文本 (Readers / Writers)
    读写基本类型数据 (long, int etc.)
    读写对象

    通过Java IO读文件

    FileInputStream或者FileReader从文件开始到文件末尾一次读取一个字节或者字符,或者将读取到的字节写入到字节数组或者字符数组。你不必一次性读取整个文件,相反你可以按顺序地读取文件中的字节和字符。

    需要跳跃式地读取文件其中的某些部分,可以使用RandomAccessFile。

    通过Java IO写文件

    根据你要写入的数据是二进制型数据还是字符型数据选用FileOutputStream或者FileWriter。你可以一次写入一个字节或者字符到文件中,也可以直接写入一个字节数组或者字符数据。数据按照写入的顺序存储在文件当中。

    通过Java IO随机存取文件

    可以通过RandomAccessFile对文件进行随机存取,随机存取并不意味着你可以在真正随机的位置进行读写操作,它只是意味着你可以跳过文件中某些部分进行操作,并且支持同时读写,不要求特定的存取顺序。这使得RandomAccessFile可以覆盖一个文件的某些部分、或者追加内容到它的末尾、或者删除它的某些内容,当然它也可以从文件的任何位置开始读取文件。

    文件和目录信息的获取

    读取文件或者目录信息时可以使用File类。

    以字节为单位的输入流的框架图

    InputStream

    (01) InputStream 是以字节为单位的输入流的超类。InputStream提供了read()接口从输入流中读取字节数据。
    (02) ByteArrayInputStream 是字节数组输入流。它包含一个内部缓冲区,该缓冲区包含从流中读取的字节;通俗点说,它的内部缓冲区就是一个字节数组,而ByteArrayInputStream本质就是通过缓冲字节数组来实现的。
    (03) PipedInputStream 是管道输入流,它和PipedOutputStream一起使用,PipedInputStream 绑定到PipedOutputStream或者通过connect()连接,能实现多线程间的管道通信。
    (04) FilterInputStream 是过滤输入流。它是DataInputStream和BufferedInputStream的超类。
    (05) DataInputStream 是数据输入流。它是用来装饰其它输入流,它“允许应用程序以与机器无关方式从底层输入流中读取基本 Java 数据类型”。
    (06) BufferedInputStream 是缓冲输入流。它的作用是为另一个输入流添加缓冲功能。
    (07) File 是“文件”和“目录路径名”的抽象表示形式。关于File,注意两点:
    a), File不仅仅只是表示文件,它也可以表示目录!
    b), File虽然在io包中定义,但是它的超类是Object,而不是InputStream。
    (08) FileDescriptor 是“文件描述符”。它可以被用来表示开放文件、开放套接字等。
    (09) FileInputStream 是文件输入流。它通常用于对文件进行读取操作。
    (10) ObjectInputStream 是对象输入流。它和ObjectOutputStream一起,用来提供对“基本数据或对象”的持久存储。

    以字节为单位的输出流的框架图

    OutputStream

    (01) OutputStream 是以字节为单位的输出流的超类。OutputStream提供了write()接口从输出流中读取字节数据。
    (02) ByteArrayOutputStream 是字节数组输出流。写入ByteArrayOutputStream的数据被写入一个 byte 数组。缓冲区会随着数据的不断写入而自动增长。可使用 toByteArray() 和 toString() 获取数据。
    (03) PipedOutputStream 是管道输出流,它和PipedInputStream一起使用,能实现多线程间的管道通信。
    (04) FilterOutputStream 是过滤输出流。它是DataOutputStream,BufferedOutputStream和PrintStream的超类。
    (05) DataOutputStream 是数据输出流。它是用来装饰其它输出流,它“允许应用程序以与机器无关方式向底层写入基本 Java 数据类型”。
    (06) BufferedOutputStream 是缓冲输出流。它的作用是为另一个输出流添加缓冲功能。
    (07) PrintStream 是打印输出流。它是用来装饰其它输出流,能为其他输出流添加了功能,使它们能够方便地打印各种数据值表示形式。
    (08) FileOutputStream 是文件输出流。它通常用于向文件进行写入操作。
    (09) ObjectOutputStream 是对象输出流。它和ObjectInputStream一起,用来提供对“基本数据或对象”的持久存储。

    以字节为单位的输入流和输出流关联的框架图

    输入流和输出流都有对应的关系,下面是将以字节为单位的输入流和输出流关联起来的图片。
    字节流对应关系

    以字符为单位的输入流的框架图

    Java Reader
    中文使用字节流读取会出现乱码,一个中文有两个字节,所以这种情况下要使用字符流。
    (01) Reader 是以字符为单位的输入流的超类。它提供了read()接口来取字符数据。
    (02) CharArrayReader 是字符数组输入流。它用于读取字符数组,它继承于Reader。操作的数据是以字符为单位!
    (03) PipedReader 是字符类型的管道输入流。它和PipedWriter一起是可以通过管道进行线程间的通讯。在使用管道通信时,必须将PipedWriter和PipedReader配套使用。
    (04) FilterReader 是字符类型的过滤输入流。
    (05) BufferedReader 是字符缓冲输入流。它的作用是为另一个输入流添加缓冲功能。
    (06) InputStreamReader 是字节转字符的输入流。它是字节流通向字符流的桥梁:它使用指定的 charset 读取字节并将其解码为字符。
    (07) FileReader 是字符类型的文件输入流。它通常用于对文件进行读取操作。

    以字符为单位的输出流的框架图

    下面,是以字符为单位的输出流的框架图。
    Java Writer

    (01) Writer 是以字符为单位的输出流的超类。它提供了write()接口往其中写入数据。
    (02) CharArrayWriter 是字符数组输出流。它用于读取字符数组,它继承于Writer。操作的数据是以字符为单位!
    (03) PipedWriter 是字符类型的管道输出流。它和PipedReader一起是可以通过管道进行线程间的通讯。在使用管道通信时,必须将PipedWriter和PipedWriter配套使用。
    (04) FilterWriter 是字符类型的过滤输出流。
    (05) BufferedWriter 是字符缓冲输出流。它的作用是为另一个输出流添加缓冲功能。
    (06) OutputStreamWriter 是字节转字符的输出流。它是字节流通向字符流的桥梁:它使用指定的 charset 将字节转换为字符并写入。
    (07) FileWriter 是字符类型的文件输出流。它通常用于对文件进行读取操作。
    (08) PrintWriter 是字符类型的打印输出流。它是用来装饰其它输出流,能为其他输出流添加了功能,使它们能够方便地打印各种数据值表示形式。

    以字符为单位的输入流和输出流关联的框架图

    下面是将以字符为单位的输入流和输出流关联起来的图片。
    Reader/Writer

    字节转换为字符流的框架图

    在java中,字节流能转换为字符流,下面是它们的转换关系图。
    In To Reader

    从中,我们可以看出。
    (01) FileReader继承于InputStreamReader,而InputStreamReader依赖于InputStream。具体表现在InputStreamReader的构造函数是以InputStream为参数。我们传入InputStream,在InputStreamReader内部通过转码,将字节转换成字符。
    (02) FileWriter继承于OutputStreamWriter,而OutputStreamWriter依赖于OutputStream。具体表现在OutputStreamWriter的构造函数是以OutputStream为参数。我们传入OutputStream,在OutputStreamWriter内部通过转码,将字节转换成字符。

    字节和字符的输入流对应关系

    In Map

    字节和字符的输出流对应关系

    Out Map

    Java I/O系列目录:

    [1]: java io系列01之 "目录"

  • 相关阅读:
    Java读书笔记
    b_aw_旅游计划(树的中心变形)
    b_lc_秋叶收集器(分类讨论dp+滚动数组优化)
    b_lg_涂色(从小区间做起,讨论s[l]和s[r]的关系)
    c_lc_早餐组合(排序+双指针)
    c_aw_鱼塘钓鱼(大根堆)
    b_pat_栈(2*multiset+stack)
    c_pat_推荐系统(set模拟)
    b_lg_时态同步(后序遍历统计每棵子树的最大高度)
    b_lc_统计不开心的朋友(预处理+模拟)
  • 原文地址:https://www.cnblogs.com/Simon-cat/p/9996612.html
Copyright © 2020-2023  润新知