• Java之IO流


      任何程序都离不开信息的输入|输出。例如:从键盘输入数据,从网络上获取数据,读取或写入文件等。在java语言中输入、输出是通过流来实现的。相关类全部封装在java.io包中。

    流的分类

      a)就数据的读取或写入而言流可以分为输入流(InputStream)或输出流(OutputStream)两大类。输入流只能读不能写,输出流相反。输入或输出都是相对于程序而言的。例如:程序从文件中读取数据叫输入流,程序向文件中写数据称作输出流。InputStream,OutputStream均直接继承自Object,且都是抽象类。

      b)按处理数据的单位不同可以分为字符流(Reader\Writer)和字节流(InputStream\OutputStream)。

      c)按照功能不同可以分为节点流和处理流。节点流是可以从一个特定的数据源(节点)读写数据(如:文件、内存)。处理流是套接在已存在的流(节点流|处理流)之上通过对数据的处理提供更强大的功能。

    一、字节流

    A)输入流

    备注:左图中背景为深色的节点流,浅色的为处理流

                      InputStream类派生 图

    InputStream类是一个抽象类,包含一套所有输入都需要的方法,可以完成最基本的从输入流读入数据的操作。其中常用的方法见下表。

    InputStream类的常用方法
    方法 描述
    public InputStream() 构造方法,子类调用
    public int read() 从当前位置读入1字节的二进制数据返回值是0-255之间的一个整数,该方法是抽象的。
    public int read(byte b[]) 从输入流中读取长度为b.length的数据并存入数组b,返回值为读取的字节数
    public int read(byte b[],int off,int len) 从输入流中的当前位置读取len个字节并存入数组b中从下标off开始的位置,返回值为读取的字节数
    public int available() 返回值为输入流可读取的字节数
    public void mark() 在输入流的当前位置作标记
    public void reset() 将位置指针返回到标记位置
    public long skip(long n) 将输入流中当前位置向后移动n个字节,返回值为跳过的字节数
    public void close() 关闭输入流

    注意:在使用完后,用显示的调用close()方法关闭流。

       

                                                          

      当程序需要从外部设备如磁盘、键盘等读入数据时,需建立一个相应类型的输入流对象来与设备建立连接。最后通过调用某个合适的输入流对象的read方法完成数据的输入操作。

    B)输出流

    备注:左图中背景为深色的节点流,浅色的为处理流

    与InputStream对应的OutputStream也是一个抽象类,其中定义了完成最基本的从输出流写入数据的方法。常用方法如下表:

    OutputStream常用方法
    方法 描述
    public OutputStream() 构造方法
    public write(int b) 将数据b写入输出流,抽象方法,由子类实现
    public write(byte b[]) 将字节数组中的全部数据写入写入输出流
    public int write(byte b[],int off,int len) 将字节数组中下标从off开始的的长度为len字节的数据写入输出流
    public void flush() 强制清空缓冲区并输出所有被缓冲的字节
    public void close() 关闭流

    注意:flush():对于缓冲流式输出,write不是直接将数据写入到与之相连的设备上,而是先输出到一个缓冲区中,到缓冲区满时再一次性写入相应的设备中。这样做可以减少cpu对外部设备的读写次数,提高系统效率。

                                                     

    当Java程序需要向外部设备写入数据时,需要先与外部设备建立一个相应类型的输出流连接。通过该连接的write实现数据的输出操作。

    二、字符流

    A)输入流Reader

    Reader类是定义Java字符流输入模式的抽象类。主要方法见下表:

    Reader类的主要方法
    方法 描述
    public abstract void close() 关闭流
    public int read() 读取流中的一个字符
    public int read(char[] cbuf) 读取一系列字符到字符数组cbuf中
    public abstract int read(char[] cbuf,int off,int len) 读取len个字符存放到字符数组cbuf中下标从off开始的位置
    public long skip(long n) 跳过n个字符
    public boolean ready() 测试流是否已准备好是否可以读取字符  
    public boolean markSupported() 测试流是否支持mark()操作
    public void mark(int numChars) 在流的当前位置作标记,最多可回溯numChars个字符
    public void reset() 将流标记重置到上次作标记处

                                                             

    B)输出流Writer

    Writer类是定义Java字符流输出模式的抽象类。主要方法见下表:

    Writer类的主要方法
    方法 描述
    public abstract void close() 关闭流
    public void write(int c) 向流中写入一个字符,写入字符存放于c的低16位中
    public void write(char[]cbuf) 将字符数组中的内容写入流
    public abstract void write(char[]cbuf,int off,int len) 将字符数组cbuf中从下标off开始的len个字符写入流
    public void write(String str) 将字符串str写入流
    public void write(String str,int off,int len) 将字符串str从off开始的len个字符写入流
    public abstract void flush() 强制清空缓冲区并输出所有被缓冲的字符
    public void reset() 将流标记重置到上次作标记处

    注意:因为Reader,Writer类是抽象类,所有其中的方法不能直接使用,而是通过其派生类:FileReader和FileWriter;BufferedReader和BufferedWriter类。

    最后再附一张java io总体派生图:

    声明:某些内容收集自互联网加以整理。

  • 相关阅读:
    记录cacti时间筛选bug的解决办法
    mysql开启远程访问权限
    Mysql 5.7.32 安装cacti-0.8.8h出错
    记录Apache无法解析PHP代码解决方法
    zabbix5.0安装问题:Time zone for PHP is not set
    数据库以及数据表的创建
    小程序框架wepy
    通用的代码总结
    html网页什么样的字体最好看,css设置各种中文字体样式代码
    vue中使用BetterScroll(网上)
  • 原文地址:https://www.cnblogs.com/byghui/p/2937814.html
Copyright © 2020-2023  润新知