美文网首页
Java IO之流的分类、体系结构以及常用方法

Java IO之流的分类、体系结构以及常用方法

作者: 程序员汪汪 | 来源:发表于2021-04-01 22:56 被阅读0次

    概述

    IOInput/Output的缩写,I/O技术是非常实用的技术,用于处理设备之间的数据传输。如读/写文件,网络通讯等。

    Java程序中,对于数据的输入输出操作以“流(stream)”的方式进行。

    java.io包下提供了各种“流”类和接口,用以获取不同种类的数据,并通过标准的方法输入或输出数据。

    流的分类

    操作数据单位:字节流、字符流

    • 对于文本文件(.txt.java.c.cpp),使用字符流处理
    • 对于非文本文件(.jpg.mp3.mp4.avi.doc.ppt,...),使用字节流处理

    数据的流向:输入流、输出流

    • input(输入):读取外部数据(磁盘、光盘等存储设备的数据)到程序(内存)中。
    • output(输出):将程序(内存)数据输出到磁盘、光盘等存储设备中。

    流的角色:节点流、处理流

    节点流:直接从数据源或目的地读写数据。

    节点流

    处理流:不直接连接到数据源,而是“连接”在已存在的流(节点流或处理流)之上,通过对数据的处理为程序提供更为强大的读写功能。

    处理流

    流的分类图示:

    流的分类

    IO流的体系结构

    流的体系

    流的体系

    红色框为4个抽象基类,蓝色背景框为常用IO流

    常用的几个IO流

    抽象基类 节点流(或文件流) 缓冲流(处理流的一种)
    InputStream FileInputStream BufferedInputStream
    OutputSteam FileOutputStream BufferedOutputStream
    Reader FileReader BufferedReader
    Writer FileWriter BufferedWriter

    对抽象基类的说明

    抽象基类 字节流 字符流
    输入流 InputSteam Reader
    输出流 OutputSteam Writer
    • 说明:Java的lO流共涉及40多个类,实际上非常规则,都是从以上4个抽象基类派生的。
    • 由这四个类派生出来的子类名称都是以其父类名作为子类名后缀。

    InputSteam & Reader

    • InputStreamReader是所有输入流的基类。
    • InputStream(典型实现:FileInputStream
      • int read()
      • int read(byte[] b)
      • int read(byte[] b,int off,int len)
    • Reader(典型实现:FileReader
      • int read()
      • int read(char[] c)
      • int read(char[] c,int off,int len)
    • 程序中打开的文件IO资源不属于内存里的资源,垃圾回收机制无法回收该资源,所以应该显式关闭文件IO资源。
    • FileInputStream从文件系统中的某个文件中获得输入字节。FileInputStream用于读取非文本数据之类的原始字节流。要读取字符流,需要使用FileReader

    InputSteam:

    • int read()

      从输入流中读取数据的下一个字节,返回0到255范围内的int字节值。如果因为已经到达流末尾而没有可用的字节,则返回值-1。

    • int read(byte[] b)

      从此输入流中将最多b.length个字节的数据读入一个byte数组中。如果因为已经到达流末尾而没有可用的字节,则返回值-1,否则以整数形式返回实际读取的字节数。

    • int read(byte[] b,int off,int len)

      将输入流中最多len个数据字节读入byte数组。尝试读取len个字节,但读取的字节也可能小于该值。以整数形式返回实际读取的字节数。如果因为流位于文件末尾而没有可用的字节,则返回值-1。

    • void close()

      关闭此输入流并释放与该流关联的所有系统资源。

    Reader:

    • int read()

      读取单个字符。作为整数读取的字符,范围在065535之间(0x00-0xffff)(2个字节的Unicode码),如果已到达流的末尾,则返回-1。

    • int read(char[] cbuf)

      将字符读入数组。如果已到达流的末尾,则返回-1。否则返回本次读取的字符数。

    • int read(char[] cbuf, int off, int len)

      将字符读入数组的某一部分。存到数组cbuf中,从off处开始存储,最多读len个字符。如果已到达流的末尾,则返回-1。否则返回本次读取的字符数。

    • void close()

      关闭此输入流并释放与该流关联的所有系统资源

    OutputSteam & Writer

    • OutputStreamWriter也非常相似:
      • void write(int b)void write(int c);
      • void write(byte[] b)void write(char[] cbuf);
      • void write(byte[] b, int off, int len)void write(char[] buff, int off, int len);
      • void flush();
      • void close();需要先刷新,再关闭此流
    • 因为字符流直接以字符作为操作单位,所以 Writer可以用字符串来替换字符数组,即以 String对象作为参数
      • void write(String str);
      • void write(String str, int off, int len);
    • FileOutputStream从文件系统中的某个文件中获得输出字节。FileOutputstream用于写出非文本数据之类的原始字节流。要写出字符流,需要使用FileWriter

    OutputStream:

    • void write(int b)

      将指定的字节写入此输出流。 write的常规协定是:向输出流写入一个字节。要写入的字节是参数b的八个低位。b的24个高位将被忽略。即写入0~255范围的

    • void write(byte[] b)

      b.length个字节从指定的byte数组写入此输出流。write(b)的常规协定是:应该与调用wite(b, 0, b.length)的效果完全相同。

    • void write(byte[] b, int off, int len)

      将指定byte数组中从偏移量off开始的len个字节写入此输出流。

    • void flush()

      刷新此输出流并强制写出所有缓冲的输出字节,调用此方法指示应将这些字节立即写入它们预期的目标。

    • void close()

      关闭此输岀流并释放与该流关联的所有系统资源。

    Writer:

    • void write(int c)

      写入单个字符。要写入的字符包含在给定整数值的16个低位中,16高位被忽略。即写入0到65535之间的 Unicode码。

    • void write(char[] cbuf)

      写入字符数组

    • void write(char[] cbuf, int off, int len)

      写入字符数组的某一部分。从off开始,写入len个字符

    • void write(String str)

      写入字符串。

    • void write(String str, int off, int len)

      写入字符串的某一部分。

    • void flush()

      刷新该流的缓冲,则立即将它们写入预期目标。

    • void close()

      关闭此输出流并释放与该流关联的所有系统资源

    输入、输出标准化过程

    输入过程

    1. 创建File类的对象,指明读取的数据的来源。(要求此文件一定要存在)
    2. 创建相应的输入流,将File类的对象作为参数,传入流的构造器中
    3. 具体的读入过程:创建相应的byte[]char[]
    4. 关闭流资源

    说明:程序中出现的异常需要使用try-catch-finally处理。

    输出过程

    1. 创建File类的对象,指明写出的数据的位置。(不要求此文件一定要存在)
    2. 创建相应的输出流,将File类的对象作为参数,传入流的构造器中
    3. 具体的写出过程:write(char[] cbuffer, 0, len)write(byte[] buffer, 0, len)
    4. 关闭流资源

    说明:程序中出现的异常需要使用try-catch-finally处理。

    下篇文章,介绍节点流的使用。

    相关文章

      网友评论

          本文标题:Java IO之流的分类、体系结构以及常用方法

          本文链接:https://www.haomeiwen.com/subject/gbwxkltx.html