java基础

java基础-day20-IO流和StringBuffer

2021-06-28  本文已影响0人  触手不可及

IO流和StringBuffer

1. IO流

1.1 IO流概述
IO流
    input 输入
    output 输出

输入输出的参照物是谁???
    输入流和输出流参照物是在内存中运行的当前程序
    QQ:
        从我电脑发送数据到你们电脑上
        我输入信息到QQ【输入流】
        QQ广播信息 【输出流】
        大家收到信息 【输入流】
    
    文件内存操作为例
        在一个Word文档中写入文本
            Ctrl + S 保存,写入数据到硬盘中!!!【输出流】
        打开一个Word文档
            从硬盘中读取数据!【输入流】

读 和 写
    read 对应输入流操作
    write 对应输出流操作
1.2 IO流分类
流向划分
    输入流
    输出流

按照操作单位划分
    字节流
        所有数据都按照字节方式操作搬运
        一般用于文件传输,信息传递,文件搬运操作...
    字符流
        按照当前计算机环境默认编码集进行文件的操作
        【字符流可以操作的文件要求】
            有且只能是使用notepad(最原始的记事本)打开,且不乱码的文件。

以下内容是IO流操作基类
    字节输入流
        InputStream
    字节输出流
        OutputStream
    字符输入流
        Reader
    字符输出流
        Writer
 
在以上基类基础上专门针对文件操作的IO流
    FileInputStream
    FileOutputStream
    FileReader
    FileWriter
1.3 文件操作输入输出字节流
FileInputStream
    文件操作字节输入流
    构造方法:
        FileInputStream(File file);
            根据File类对象创建对应文件的输入字节流对象
        FileInputStream(String path);
            根据指定的路径创建对应文件的输入字节流对象
    成员方法:
        int read();
            从文件中读取一个字节数据,通过返回值返回。这里返回值数据类型是int类
            型,但是实际有效数据是整个int类型的低八位
        int read(byte[] buf);
            从文件中读取数据到byte类型数组中,返回值类型是读取到当前byte类型数
            组有效元素个数(字节数)
        int read(byte[] buf, int off, int len);
            从文件中读取数据到byte类型数组中,并且要求数组中从下标位置off开始保
            存数据,最大长度为len。返回值类型是读取到当前byte类型数组有效元素个
            数(字节数)
        以上所有读取数据的方法,如果读取到文件默认,全部返回-1 EOF End of File
        
FileOutputStream
    文件操作字节输出流
    构造方法:
        FileOutputStream(File file);
            根据指定File类对象创建对应文件的输出字节流
        FileOutputStream(String file);
            根据指定的String文件路径,创建对应的输出字节流
        FileOutputStream(File file, boolea append);
            根据指定File类对象创建对应文件的输出字节流
            append为true,表示追加写
        FileOutputStream(String file, boolean append);
            根据指定的String文件路径,创建对应的输出字节流
            append为true,表示追加写
        【注意】
            1. FileOutputStream是拥有创建文件的能力,只要路径合法,文件有写入
            权限,没有其他异常情况,在创建FileOutputStream对象过程中,文件不
            存在情况下创建对应文件
            
            2. 构造方法中如果没有第二个参数,默认方式为【删除写】需要清空当前文
            件的所有内容,从头开始写入数据。如果标记第二个参数为true,操作方式为
            【追加写】从上一次文本的末尾开始写入数据
    成员方法:
        void write(int b);
            写入一个字节数据到文件中
        void write(byte[] buf);
            写入一个字节数组数据到文件中
        void write(byte[] buf, int off, int len);       
            写入一个字节数组数据,要求从off位置开始,到len结束。
1.4 文件拷贝操作
在代码中使用缓冲字节数组,读取效率会极大的提高。

使用字节数组作为缓冲操作!!!

流程:
    1. 明确源数据文件
    2. 明确目标文件
    3. 打开源数据文件输入字节流
    4. 打开目标文件输出字节流
    5. 从源数据文件中读取数据,直至文件末尾 -1 EOF End of File
    6. 写入数据到目标文件
    7. 先开后关,后开先关
1.5 文件操作输入输出字符流
FileReader
    构造方法:
        FileReader(File file);
        FileReader(String path);
        
    成员方法:
        int read();
        int read(char[] buf);
        int read(char[] buf, int off, int len);
    
FileWriter
    构造方法:
        FileWriter(File file);
        FileWriter(String path);
        FileWriter(File file, boolean append);
        FileWriter(String path, boolean append);
        
        /*
        代码中的功能整合!!!
        */
        FileWriter(File file, boolean append);
        
        FileWriter(String path) {
            this(new File(path), false);
        }
        
        FileWriter(File file) {
            this(file, false);
        }
        
        FileWriter(String path, boolean append) {
            this(new File(path), append);
        }
    
    成员方法:
        void write(int ch);
        void write(char[] buf);
        void write(char[] buf, int off, int len);
        void write(String str);
/*
字符流操作的局限性:
    1. 非常容易出现乱码问题
    2. 支持的文件格式过少
    3. 有且只能支持notepad直接打开且没有乱码的文件
*/
1.6 缓冲的重要性
缓冲 ==> 缓存!!!
    视频播放网站,在网络存在一定压力的情况下,需要进行缓冲!!!

上午代码中
    162MB的文件,如果按照一个字节一个字节读取操作需要179S
    采用字节数组作为缓冲区操作,只需要0.05S

缓冲在文件操作中使用是可以极大的提高效率
    1. 减少了CPU 通过 内存 打开关闭硬盘的次数!!!
    2. 同时借助于计算机原理读取数据的要求,尽量满足4KB读取情况
    3. 保护硬盘!!!

缓冲操作在计算机中给我们提供了系统缓冲流
1.7 系统提供的缓冲流
【明确】
    Java中所有的缓冲流都没有操作文件的能力!!!每一个缓冲流都需要对应的字节流或者字符流提供对应的读写能力!!!
    
    缓冲流实际上就是一个缓冲内存空间,通常都是数组类型
    字节缓冲
        底层使用的是一个容量为8192的字节数组
    字符缓冲
        底层使用的是一个容量为8192的字符数组

字节缓冲
    输入流
        BufferedInputStream
    输出流
        BufferedOutputStream
字符缓冲
    输入流
        BufferedReader
    输出流
        BufferedWriter
1.8 字节缓冲流
BufferedInputStream
    构造方法
        BufferedInputStream(InputStream in);
        创建BufferedInputStream对象,使用InputStream字节输入流对象作为当前
        构造方法参数,用于提供读取文件能力
    成员方法
        int read();
        int read(byte[] buf);
        int read(byte[] buf, int off, int len);
        以上方法全部由InputStream提供,操作方式和InputStream一致。只不过效率
        很高。

BufferedOutputStream    
    构造方法
        BufferedOutputStream(OutputStream out);
        使用字节输入流对象,作为当前构造方法的参数,提供写入文件数据的能力
    成员方法
        void write(int b);
        void write(byte[] buf);     
        void write(byte[] buf, int off, int len);
        所有的写入文件操作,并不是直接将数据写入到文件内,而且首先将数据存储于底层
        缓冲数组中,当前出现以下三种情况,会将数据真正的写入到文件
            1. 当前缓冲流关闭
            2. 当前缓冲区已满,需要写入数据清空重置。
            3. 调用flush方法,清空缓冲区,将缓冲区数据写入到文件中。
1.9 字符缓冲流
BufferedReader
    Constructor
        BufferedReader(Reader in);
    
    Method
        int read();
        int read(char[] buf);
        int read(char[] buf, int off, int len);
        
        String readLine();
            从文件中读取一行数据!!!如果读取到文件默认,返回null
                \n \r
BufferdWriter
    Constructor
        BufferedWriter(Writer out);
    Method
        void write(int ch);
        void write(char[] buf);     
        void write(char[] buf, int off, int len);       
        void write(String str);     
        void write(String str, int off, int len);
        void newLine();
            换行!!!
    字符流操作有且只能针对于可以使用记事本打开的可视化文本文件,而且要求和当前程序使用的编码集一致!!!

2. StringBuffer

2.1 String冗余问题
    String字符串是一个常量,在实际开发过程中,存在大量的字符串拼接问题。如果按照最原始的方式来进行拼接操作,会导致内存的大量浪费。
    Java中提供了两种可变长字符串。
        StringBuffer
            线程安全,性能较差。【所有的方法都有synchronized修饰】
        StringBuilder
            线程不安全,性能优越!!!
        底层默认情况下都是一个容量为16个的char类型数组
2.2 StringBuffer常用方法
2.2.1 构造方法
StringBuffer();
    创建StringBuffer可变长字符数组对象,默认底层char类型数组容量为16
StringBuffer(int capacity);
    根据用户指定的Capacity容量,明确当前底层char类型数组容量
StringBuffer(String str);
    根据用户指定的字符串创建StringBuffer类对象,并且要求底层char类型数组容量为 str.length() +16
2.2.2 添加方法
StringBuffer append(EveryThing);
    添加任意类型到当前StringBuffer

StringBuffer insert(int index, EveryThing);
    添加任意类型到指定下标位置中。
2.2.3 删除
delete(int start, int end);
    删除从start到end范围之间的数据。要头不要尾
deleteCharAt(int index);
    删除指定下标的元素
2.2.4 替换,逆序
replace(int start, int end, String str)
    使用指定字符串,替换从指定位置开始到结尾的内容
reverse();
    逆序
上一篇下一篇

猜你喜欢

热点阅读