流分类:
- 流向:输入流和输出流
- 数据:字节流和字符流
字符流和字节流和文件:
- 字节流:可以操作任何数据,因为在计算机中任何数据都是以字节的形式存储的,包括二进制、音频、视频、doc等
输入流:InputStream FileInputStream
输出流:OutputStream FileOutputStream
FileInputStream fis = new FileInputStream("aaa.mp3"); //创建输入流对象,关联aaa.mp3
FileOutputStream fos = new FileOutputStream("bbb.mp3");//创建输出流对象,关联bbb.mp3,如果没有bbb.txt,会创建出一个
int b;
while((b = fis.read()) != -1) { //没读到内容时返回-1
fos.write(b);
}
fis.close();
fos.close();
FileInputStream fis = new FileInputStream("xxx.mp3");
FileOutputStream fos = new FileOutputStream("copy.mp3");
byte[] arr = new byte[fis.available()]; //根据文件大小做一个字节数组
fis.read(arr); //将文件上的所有字节读取到数组中
fos.write(arr); //将数组中的所有字节一次写到了文件上
fis.close();
fos.close();
FileInputStream fis = new FileInputStream("xxx.mp3");
FileOutputStream fos = new FileOutputStream("copy.mp3");
int len;
byte[] arr = new byte[1024 * 8]; //自定义字节数组
while((len = fis.read(arr)) != -1) {
//fos.write(arr);
fos.write(arr, 0, len); //写出字节数组写出有效个字节个数
}
fis.close();
fos.close();
- 字符流:只能处理纯文本,全部为可见字符,txt、html
输入流:Reader FileReader
输出流:Writer FileWriter
//字符流读取字符, 就要先读取到字节数据, 然后转为字符. 如果要写出字符, 需要把字符转为字节再写出.
//FileReader类的read()方法可以按照字符大小读取
//FileWriter类的write()方法可以自动把字符转为字节写出
FileReader fr = new FileReader("a.txt");
FileWriter fw = new FileWriter("b.txt");
int ch;
while((ch = fr.read()) != -1) {
fw.write(ch);
}
fr.close();
fw.close();
FileReader fr = new FileReader("aaa.txt"); //创建字符输入流,关联aaa.txt
FileWriter fw = new FileWriter("bbb.txt"); //创建字符输出流,关联bbb.txt
int len;
char[] arr = new char[1024*8]; //创建字符数组
while((len = fr.read(arr)) != -1) { //将数据读到字符数组中
fw.write(arr, 0, len); //从字符数组将数据写到文件上
}
fr.close(); //关流释放资源
fw.close();
操作:
1)建立联系 File对象
2)选择流
3)操作 数组大小+read、write
4)释放资源
处理流:
增强功能,提高性能,节点流之上
一、缓冲流
1)字节缓冲流
BufferedInputStream BufferedOutputStream
FileInputStream fis = new FileInputStream("aaa.mp3"); //创建文件输入流对象,关联aaa.mp3
BufferedInputStream bis = new BufferedInputStream(fis); //创建缓冲区对fis装饰
FileOutputStream fos = new FileOutputStream("copy.mp3"); //创建输出流对象,关联copy.mp3
BufferedOutputStream bos = new BufferedOutputStream(fos); //创建缓冲区对fos装饰
int b;
while((b = bis.read()) != -1) {
bos.write(b);
}
bis.close(); //只关装饰后的对象即可
bos.close();
2)字符缓冲流
BufferedReader BufferedWriter
//BufferedReader的read()方法读取字符时会一次读取若干字符到缓冲区, 然后逐个返回给程序, 降低读取文件的次数, 提高效率
//BufferedWriter的write()方法写出字符时会先写到缓冲区, 缓冲区写满时才会写到文件, 降低写文件的次数, 提高效率
BufferedReader br = new BufferedReader(new FileReader("aaa.txt")); //创建字符输入流对象,关联aaa.txt
BufferedWriter bw = new BufferedWriter(new FileWriter("bbb.txt")); //创建字符输出流对象,关联bbb.txt
int ch;
while((ch = br.read()) != -1) { //read一次,会先将缓冲区读满,从缓冲区中一个一个的返给临时变量ch
bw.write(ch); //write一次,是将数据装到字符数组,装满后再一起写出去
}
br.close(); //关流
bw.close();
// BufferedReader的readLine()方法可以读取一行字符(不包含换行符号)
// BufferedWriter的newLine()可以输出一个跨平台的换行符号"
"
BufferedReader br = new BufferedReader(new FileReader("aaa.txt"));
BufferedWriter bw = new BufferedWriter(new FileWriter("bbb.txt"));
String line;
while((line = br.readLine()) != null) {
bw.write(line);
//bw.write("
"); //只支持windows系统
bw.newLine(); //跨平台的
}
br.close();
bw.close();
二、转换流:字节流转字符流,处理乱码
//FileReader是使用默认码表读取文件, 如果需要使用指定码表读取, 那么可以使用InputStreamReader(字节流,编码表)
//FileWriter是使用默认码表写出文件, 如果需要使用指定码表写出, 那么可以使用OutputStreamWriter(字节流,编码表)
BufferedReader br = //高效的用指定的编码表读
new BufferedReader(new InputStreamReader(new FileInputStream("UTF-8.txt"), "UTF-8"));
BufferedWriter bw = //高效的用指定的编码表写
new BufferedWriter(new OutputStreamWriter(new FileOutputStream("GBK.txt"), "GBK"));
int ch;
while((ch = br.read()) != -1) {
bw.write(ch);
}
br.close();
bw.close();
IO流(flush和close方法的区别)
- flush()方法
- 用来刷新缓冲区的,刷新后可以再次写出
- close()方法
- 用来关闭流释放资源的,如果是带缓冲区的流对象的close()方法,不但会关闭流,还会再关闭流之前刷新缓冲区,关闭后不能再写