IO流

1.概述

    IO参照物是当前程序使用内存

    I : input 从硬盘读取数据到内存! read 读

    O : output 从内存写入数据到硬盘! write 写

    对于Java而言: 按照处理单位来看

        字节流: 所有的数据按照字节方式进行传输!

        字符流: 数据按照当前系统采用的编码集方式进行字符操作,该操作局限性很大!

                        所能操作的并且不会出现错误的文件,有且只有记事本打开无乱码的文本文件

    组合:字节输入流,字节输出流,字符输入流,字符输出流。

2.缓存概念

    缓存缓冲有什么好处?

        一般的网站,第二次打开总比第一次打开速度要快!

        第一次加载网站打开的过程中,会对当前网页一些固定资源进行保存,提高用户在访问页面时的速度,优化体验!

    开发中使用缓存缓冲可以有效地提高文件操作效率!

3. IO流分类

    class InputStream    字节输入流基类

    --|    class FileInputStream    文件操作字节输入流

    class OutputStream    字节输出流基类

    --|    class FileOutputStream    文件操作字符输入流

    class Reader    字符输入流基类

    --|    class FileReader    文件操作字符输入流

    class Writer    字符输出流基类

    --|    class FileWriter    文件操作字符输出流

    需要学习的方法: read    write

    缓冲流:

        BufferedInputStream    字节输入缓冲流

        BufferedOutputStream    字节输出缓冲流

        BufferedReader        字符输入缓冲流

        BufferedWriter    字符输出缓冲流

4.FileInputStream文件操作字节输入流

    Constructor构造方法

        FileInputStream(String filePath);    根据用户指定的文件路径创建对应的FileInputStream,文件操作输入字节流,如果文件不存在,抛出异常FileNotFoundException

    FileInputStream(File file);    根据用户指定对应文件的File类对象,创建对应的FileInputStream,如果文件不存在,抛出异常FileNotFoundException

    Method成员方法

        int read();    从文件中读取一个字节数据返回。如果读取到末尾,返回-1 EOF Of File

        int read(byte[] buf);【重点】    从文件中读取数据到缓冲数组buf中,返回值类型是从文件中读取到的字节个数,如果读取到文件末尾,返回-1,EOF Of File

        读取数据的方法,在运行过程中出现了问题,抛出异常IOException

    操作流程:

        1.明确对应文件的路径,可以选择直接给与对应的String类型路径,或者创建对应的File类对象,作为参数

        2.创建FileInputStream文件操作字节输入流,打开文件操作管道

        3.从FileInputStream对象中使用方法,读取数据

        4.关闭资源!FileInputStram类对象==>水龙头!

演示
演示
时间效率

5.FileOutputStream 文件操作字节输出流

    Constructor构造方法

        FileOutputStream(String filePath);    根据用户指定的路径,创建对应的FileOutputStream文件操作输出流对象。如果路径不合法,抛出异常FileNotFoundException。采用写入数据到文件的方式,是【删除写】!!!文件内容清空,在写入数据

        FileOutputStream(File file);    根据用户指定的File类对象,创建对应FileOutputStream文件操作输出流对象,如果路径不合法,抛出异常FileNotFoundException。采用写入数据到文件的方式,是【删除写】!!!文件内容清空,在写入数据

        FileOutputStream(String filePath, boolean append);    根据用户指定的路径,创建对应的FileOutputStream文件操作输出流对象。如果路径不合法,抛出异常FileNotFoundException。append参数是boolean类型,如果传入参数为true,表示【追加写】,在文件末尾写入数据

        FileOutputStream(File file, boolean append);    根据用户指定的File类对象,创建对应FileOutputStream文件操作输出流对象,如果路径不合法,抛出异常FileNotFoundException。append参数是boolean类型,如果传入参数为true,表示【追加写】,在文件末尾写入数据

    Method成员方法    

        void write(int b);    写入一个字节数据写入到文件中

        void write(byte[] buf);    写入一个字节数组到文件中    

        void write(byte[] buf, int off, int count);    写入一个字节数组到文件中,要求从off偏移位置开始,计数count

    操作流程:

        1. 明确对应文件的路径,可以选择直接给予对应的String类型路径,或者创建对应的File类对象,作为参数

        2. 创建FileOutputStream文件操作输出字节流,打开文件操作管道

        3. 使用FileOutputStream对象写入数据到文件中

        4. 关闭资源!!!

    注意:

        1.FileOutputStream拥有创建文件的能力,在路径合法,且对应目录有写入权限下可以创建文件

        2.区分删除写和追加写

演示

6.FileReader 文件操作字符输入流

    Constructor构造方法

        FileReader(String filePath);    根据指定路径的文件创建对应的文件字符输入流对象,如果文件不存在,抛出异常FileNotFoundException

FileReader(File file);    根据指定路径的File类对象创建文件字符输入流对象,如果文件不存在,抛出异常FileNotFoundException

    Method成员方法

    int read();    从文件中读取一个字符数据,返回值为int类型,int类型数据中有且只有低十六位是有效数据,如果读取到文件末尾返回-1 EOF End Of File

    int read(char[] buf);    从文件中读取数据到char类型缓冲数组buf,返回值是读取到字符个数。如果读取到文件末尾返回-1 EOF End Of File

    操作流程:

        1. 明确需要读取数据的文件

        2. 创建FileReader对象,打开文件操作管道

        3. 使用FileReader类对象方法,读取文件数据

        4. 关闭资源

演示

7.FileWriter文件操作字符输出流

    Constructor构造方法:

        FileWriter( String filePath);    根据用户指定的路径,创建对应的FileWriter文件操作字符输出流对象。如果路径不合法,抛出异常FileNotFoundException。采用写入数据到文件的方式,是【删除写】!!!文件内容清空,在写入数据

        FileWriter(File file);    根据用户指定的File类对象,创建对应FileWriter文件操作字符输出流对象,如果路径不合法,抛出异常FileNotFoundException。采用写入数据到文件的方式,是【删除写】!!!文件内容清空,在写入数据

        FileWriter(String filePath, boolean append);    根据用户指定的路径,创建对应的FileWriter文件操作字符输出流对象。如果路径不合法,抛出异常FileNotFoundException。append参数是boolean类型,如果传入参数为true,表示【追加写】,在文件末尾写入数据

        FileWriter(File file, boolean append);    根据用户指定的File类对象,创建对应FileWriter文件操作字符输出流对象,如果路径不合法,抛出异常FileNotFoundException。append参数是boolean类型,如果传入参数为true,表示【追加写】,在文件末尾写入数据

    Method成员方法:

        void write(int ch);    写入一个字符数据写入到文件中

        void write(char[] buf);    写入一个字符数组到文件中

        void write(char[] buf, int off, int count);    写入一个字符数组到文件中,要求从off偏移位置开始,计数count

        void write(String str);    写入一个字符串到文件中

        void write(String str, int offset, int count);    写入一个字符串到文件中,要求从offset偏移位置开始,计数count

    注意:

        1. FileWriter拥有创建文件的能力,在路径合法,且对应目录有写入权限下可以创建文件

        2. 区分删除写和追加写

演示

8.关于字节流和字符流总结

    1.套路是一样的! 明确文件 - 打开管道 - 操作文件 - 关闭资源

    2.核心方法    read 读取,输入;    write 写入,输出

    3.输出流有创建文件的能力

    4.输出流需要注意是删除写还是追加写

    5.一定要注意关闭资源!resource

9.文件拷贝对比

    9.1 字符流字节流对比

            字节流拷贝:

字节流拷贝

            字符流拷贝:

字符流拷贝

    9.2字符流操作效率问题

            单字节拷贝操作:

单字节拷贝

            缓冲数组形式操作:

缓冲数组形式操作

    有缓冲和无缓冲对比:

        1.在没有使用缓冲的情况下,每一次需要向磁盘读取一个字节数据,然后写入一个字节数据,这样会导致代码中出现太多次数的打开和关闭磁盘次数。极大影响效率!

        2.缓冲之后,我们降低了对于磁盘开启的次数,并且符合CPU操作磁盘的模式,CPU从磁盘读取数据是每次4KB

你可能感兴趣的:(IO流)