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