1、IO流的分类
IO流用于设备间进行数据传输。
分类:
A:按流向分
输入流——读取数据
输出流——写入数据
B:按数据类型分
字节流
InputStream字节输入流——读取字节类型数据
OutputStream字节输出流——写入字节类型数据
字符流(方便操作文本文档)
Reader字符输入流——读取字符类型数据
Writer字符输出流——写入字符类型数据
注意:当数据是文本文档时,也就是说当用系统自带记事本打开能读懂时,才使用字符流。否则,一律使用字节流,如图片、视频文件等。
2、字节流的使用
字节流读取数据再写入数据的方式有两种(以File的操作举例):
方式一:用字节输入流读取,用字节输出流写入
说明:这种方法效率低下,可以读取一个字节,也可以读取一个字节数组,它可以对任何形式的文件进行处理。
FileInputStream读取数据/FileOuputStream写入数据:
代码实现:
//创建字节输入流
FileInputStream fis = new FileInputStream("a.txt");
//创建字节输出流
FileOutStream fos = new FIleOutputStream("b.txt");
//方式1:读取一个字节
int by = 0;
//读取并判断是否读取完
while((by = fis.read()) != -1){ fis.read()返回的是数据by的值
fos.write();
}
//方式2:读取一个字节数组
byte[] bys = new byte[1024];//一般字节数组的长度时1024或1024 的整数倍
int len = 0;
while((len = fis.read(bys)) != -1){ //fis.read(bys):返回的是字节数组bys的长度
fos.write(bys,0,len);
fos.fluse(); //每读一个数组刷新一次
}
//释放资源
fos.close();
fis.close();
方式二:用字节缓冲输入流读取数据,用字节缓冲输出流写数据
说明:使用缓冲区可以大大提高效率。
代码实现:
//创建字节缓冲输入流对象
BufferedInputStream bis = new BufferedInputStream( new FileInputStream("a.txt") );
//创建字节缓冲输出流对象
BufferedoutputStream bos = new BufferedOutputStream( new FIleOuputStream("b.txt"));
//方式1:一次读取一个字节
int by = 0;
while((by = bis.read()) != -1){
bos.write();
}
//方式2:一次读取一个字节数组
byte[] bys = new byte[1024];
int len = 0;
while((len = bis.read(bys)) != -1){
bos.write( bys , 0 , len);
}
字节流数据效率比较:
读取一个字节 < 缓冲区读取一个字节 < 读取一个数组 < 缓冲区读取一个数组
3、字符流的使用
字符流就是:字节流 + 编码表
IO流中的编码问题:
A:OutputStreamWriter
OutputStreamWriter(OutputStream os):默认编码,GBK
OutputStreamWriter(OutputStream os,String charsetName):指定编码。
B:InputStreamReader
InputStreamReader(InputStream is):默认编码,GBK
InputStreamReader(InputStream is,String charsetName):指定编码
编码问题只要解码和编码使用一致即可。
字符流
Reader
|–InputStreamReader 字符输入流
|–FileReader (可以替代InputStreamReader)
|–BufferedReader 字符缓冲输入流
Writer
|–OutputStreamWriter 字符输出流
|–FileWriter (可以替代OutputStreamWriter)
|–BufferedWriter 字符缓冲输出流
用字符缓冲IO流实现文本文档的复制:
//创建字符缓冲输入流对象
BufferedReader br = new BufferedReader(new FileReader(
"a.txt"));
//创建字符缓冲输出流对象
BufferedWriter bw = new BufferedWriter(new FileWriter(
"b.txt"));
//读取字符将字符写入目的地
char[] chs = new char[1024];
int len =0;
while ((len=br.read(chs))!=-1){
//写入b.txt
bw.write(chs,0,len);
bw.flush();
}
bw.close();
br.close();