文章目录
IO流
1.什么是I0流?
存储和读取数据的解决方案l: input0: output
流:像水流一样传输数据
2.IO流的作用?
用于读写数据 (本地文件,网络)
3.IO流按照流向可以分类哪两种流?
输出流: 程序->文件
输入流: 文件->程序
4.IO流按照操作文件的类型可以分类哪两种流?字节流: 可以操作所有类型的文件字符流:只能操作纯 文本文件
5.什么是纯文本文件?用windows系统自带的记事本打开并且能读懂的文件txt文件,md文件,xml文 件,lrc文件等
一、字节文件输入和输出流对象
1.字节输出流(FileOutputStream)
(1)创建对象
// 创建对象
FileOutputStream fos=new FileOutputStream("E:\\1111\\1111\\test\\bbb.txt");
// 写入数据
fos.write(97);
// 释放资源
fos.close();
- 参数表示的路径或者是File对象都可以
- 如果文件不存在,则会创建一个新的文件,但是要保证父级路径是存在的
- 如果文件已经存在,则会覆盖原来文件中的数据
(2)FileOutputStream写数据的3种方式
方法 | 含义 |
---|---|
void write(int b) | 一次写一个字节数据 |
void write(byte[] b) | 一次写一个字节数组数据 |
void write(byte[] b,int off,int len) | 一次写一个字节数组的部分数据 |
- void write(byte[] b) 将字节数组中的所有数据全部写入文件中
FileOutputStream fos=new FileOutputStream("E:\\1111\\1111\\test\\bbb.txt");
byte[] b1= {97,98,99};
fos.write(b1);
- void write(byte[] b,int off,int len)
FileOutputStream fos=new FileOutputStream("E:\\1111\\1111\\test\\bbb.txt");
byte[] b1= {97,98,99};
fos.write(b1,1,2);
byte[] b:表示传入的目标数组
int off:从数组的 off 位置开始
int len:需要传入的个数
2.字节输入流(FileInputStream)
操作本地文件的字节输入流,可以把本地文件中的数据读取到程序中去
(1)创建对象
// 创建对象
FileInputStream fis=new FileInputStream("E:\\1111\\1111\\test\\bbb.txt");
// 读取数据
fos.read(97);
// 释放资源
fos.close();
- 如果文件不存在,就直接报错
- 一次读一个字节,读出来的是数据在ASCII上对应的数字
- 读到文件末尾了,read方法返回-1
- 每次使用完流必须要释放资源
(2)FileInputStream循环读取数据
FileInputStream fis=new FileInputStream("E:\\1111\\1111\\test\\bbb.txt");
int b;
while((b=fis.read()) != -1){
System.out.printli(b);
}
fis.close()
二、字符文件输出和输入流对象
1、字符输出流(FileWriter)
构造方法 | 含义 |
---|---|
public FileWriter(File file) | 创建字符输出流并关联本地文件 |
public FileWriter(String pathname) | 创建字符输出流并关联本地文件 |
public FileWriter(File file,boolean append) | 创建字符输出流并关联本地文件,续写 |
public FileWriter(String pathname,boolean appnd) | 创建字符输出流并关联本地文件,续写 |
若文件存在,则清空文件,若不存在,则新建文件
成员方法 | 含义 |
---|---|
void write(int c) | 写出一个字符 |
void write(String str) | 写出一个字符串 |
void write(String,int off,int len) | 写出一个字符串的一部分 |
void write(char[] cbuf) | 写出一个字符数组 |
void write(char[] cnuf,inty off,int len) | 写出一个字符数组的一部分 |
void flush() | 将缓冲区中是的数据,全部输出到文件中,并清空缓冲区 |
2、字符输入流(FileReader)
(1)创建对象
构造方法 | 含义 |
---|---|
public FileReader(File file) | 创建字符输入流关联本地文件 |
public FileReader(String pathName) | 创建字符输入流关联本地文件 |
如果读取文件不存在,则直接报错
(2)读取数据
成员方法 | 含义 |
---|---|
public int read() | 读取数据,读到末尾返回 -1 |
public int read(char[] buffer) | 读取多个数据,读到末尾返回 -1 |
按字节进行读取,遇到中文,一次读多个字节,读取后解码,返回一个整数
1.read()
FileReader fr=new FileReader("E:\\1111\\1111\\test\\fileReaderDemo01.txt");
int len;
while((len=fr.read())!=-1) {
System.out.print((char)len);
}
fr.close();
注意
- read()默认也是 一个一个字节读取,如果遇到中文就会一次读多个字节
- 在读取之后,方法的底层还会进行解码并转成十进制,最终把这个十进制作为返回值
- 这个十进制也表示在字符集上的数字
2.read(char[] buffer)
FileReader fr1=new FileReader("E:\\1111\\1111\\test\\fileReaderDemo01.txt");
char[] chars=new char[2];
while((len=fr1.read(chars))!=-1) {
System.out.println(len);
System.out.println(new String(chars,0,len));
}
注意
- 有参构造方法在底层进行了读取数据、解码、强制类型转换,并把强转后的数据存放在数组中
3、字符流原理解析
①创建字符输入流对象
底层:关联文件,并创建缓冲区 (长度为8192的字节数组)
②读取数据
底层:1、**判断缓冲区中是否有数据可以读取 **
2、缓冲区没有数据:就从文件中获取数据,装到缓冲区中,每次尽可能装满缓冲区
如果文件中也没有数据了,返回-1
3、缓冲区有数据:就从缓冲区中读取
空参的read方法:一次读取一个字节遇到中文一次读多个字节,把字节解码并转成十进 制返回
有参的read方法:把读取字节,解码、强转三步合并了,强转之后的字符放到数组中
当使用FileWriter创建对象时,往本地文件中写数据时,先会写到缓冲区,当缓冲区写满后,会将缓冲区内的数据一并写入本地文件,若缓冲区未满,则使用flush方法进行处理
4、包装器(BufferedReader)
相当于功能扩展器,并自带一个缓冲区,使得效率更高
方法 | 含义 |
---|---|
void readLine() | 一次读取一行 |
void flush(0) | 将缓冲区中是的数据,全部输出到文件中,并清空缓冲区 |
void newLine() | 跨平台换行 |