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();
逆序