IO流
1.什么是IO流
存储和读取数据的解决方案
2.IO流的作用
用于读写数据(本地,网络)
3.IO流按照流向可以分为哪两种?
程序->文件 (Input)
文件->程序(Output)
4.IO流按照操作文件的类型可以分为哪两种?
字节流:操作所有类型文件
字符流:智能操作纯文本文件(txt,md,xml等)
IO流的体系
字节流
-
InputStream
FileInputStream(文件字节输入流)
流程:
创建对象
参数是字符串表示的路径或者File对象都可以
如果路径文件不存在会报错
new .FileIntputStream()
写数据
fos.read()
一次读一个字节,读出来的是ASCII上对应的字符
读到文件末尾,read方法返回-1
循环读取
int b;
read读一次移动一次指针,用一个中间值作为返回值载体
while((b=fis.read())!=-1){
System.out.println((char)b)
}
释放资源
每次使用完必须释放资源
fis.close()-
OutputStream
FileOutputStream(文件字节输出流)
流程:
创建对象
new .FileOutputStream()
参数是字符串表示的路径或者File对象都可以
如果文件不存在会创建一个新文件,但父级路径必须纯在
如果文件已存在会清空
写数据
三种方式
1个字节
fos.write(byte)
1个数组
fos.write(byte[])
1个数组的部分
fos.write(byte[],起始索引,个数)
写到本地文件中的是整数在ASCII对应的字符
释放资源
fos.close()
每次使用完流都要释放资源
两个补充:
如果不想清空已有文件,需要把续写开关打开(创建对象时加入一个参数true,默认不写是false)
如果想要换行可以写入\r\n进行换行.
文件拷贝流程
1.创建输入输出流
2.创建byte数组来控制每次读取的大小
3.用len记录每次的读取长度
4.边读边写,读多少,写多少
5.释放资源
public static void main(String[] args) throws IOException {
FileInputStream fis = new FileInputStream("aaa.txt");
FileOutputStream fos=new FileOutputStream("bbb.txt");
int len;
byte [] bytes=new byte[1024*1024*5];
while ( (len=fis.read(bytes))!=-1){
fos.write(bytes,0,len);
}
fis.close();
fos.close();
}
字符流
字符集
1.计算机中任意数据都是以二进制的形式来存储的
2.计算机中最小的存储单元是一个字节
3ASCII中,一个英文占一个字节
4.简体中文Windos,默认使用GBK字符集
5.GBK完全兼容ASCII
一个英文一个字节,开头是0
一个中文占两个字节,高位字节开头是1
6.UTF-8
一个英文一个字节,开头是0,转换成十进制是正数
一个中文三个字节,格式为1110xxxx 10xxxxxx 10xxxxx
7.为什么会有乱码
原因一:没有读取完整的汉字
原因二:编码解码方式不统一
解决办法:
不要用字节流读取文本文件
编码解码用同一种方式
-
Reader
FileReader(文件字节输入流)
流程:
创建对象
参数是字符串表示的路径或者File对象都可以
如果路径文件不存在会报错
new .FileReader()
写数据
fr.read()无参
默认一次读一个字节,遇到中文一次读写多个,GBK一次两字节,UTF-8一次三个字节(默认)
读到文件末尾,read方法返回-1
循环读取
int b;
read读一次移动一次指针,用一个中间值作为返回值(二进制转换成的十进制数据)载体
while((b=fis.read())!=-1){
System.out.println((char)b)
}
frread(char{})有参
char [] chars=new char[2].;
int len;
read读一次移动一次指针,用一个中间值作为返回值(二进制转换成的十进制数据)载体
while((len=fr.read(chars))!=-1){
System.out.println(new String(chars,起始索引,len))
}
释放资源
每次使用完必须释放资源
fr.close()
-
writer
FileWriter(文件字符输出流)
流程:
创建对象
new .FileOutputStream()
参数是字符串表示的路径或者File对象都可以
如果文件不存在会创建一个新文件,但父级路径必须存在在
如果文件已存在会清空
写数据
五种方式
先进行编码,编码后再写到文件中(默认UTF-8)
1个字符
fw.write(int)//
1个字符串
fw.write(String)
1个字符串的部分(String,起始索引,个数)
1个char数组
fw.write(char[])
1个char数组的部分(char[],起始索引,个数)
写到本地文件中的是整数在ASCII对应的字符
释放资源
fw.close()
每次使用完流都要释放资源
两个补充:
如果不想清空已有文件,需要把续写开关打开(创建对象时加入一个参数true,默认不写是false)
如果想要换行可以写入\r\n进行换行.
字符输入流底层原理
创建对象
关联文件,并创建一个缓冲区(长度为8192字节的数组)
提取数据
1.判断缓冲区是否有数据可读
2.缓冲区没有数据,就从文件中获取数据装入缓冲区,每次尽可能装满,文件也没有了返回-1
3.缓冲区有数据,从缓冲区中读取
空参,一次读一个字节,中文读多个字节,并把字节解码并转成十进制返回
有参,把读取,解码,强转三步合一,强转之后的字符放到数组中
字符输出流底层原理
在文件中写入操作前会将文件中的数据转换成字节并存入缓冲区中每次尽可能装满.
1.装满了,自动写入
2.未装满,利用flush刷新就会写入文件,刷新后还可以继续进行写入
3.未装满,利用close回收资源,此时会将缓冲区中的内容写入文件并结束这次输出.
标签:字符,字节,文件,read,fos,char,IO,new From: https://www.cnblogs.com/zlsame/p/17230959.html