一、缓冲的概念
例:
看视频的时候觉得卡,等他一会,让他缓冲一下。
快递不是一件商品发过来,攒够一车发过来。
计算机的cpu通过内存从磁盘上面获取数据的,不是一个字节一个字节读的。每次从磁盘上面读4kb的数据。
这是为了减少cpu通过内存访问磁盘的次数。
1.为了提高读取和存储的效率
2.保护咱们的磁盘(硬盘)
操作文件:
读取和写入数据,如果你按照一个字节或者一个字符进行处理的时候,效率是非常低的。采用缓冲的概念来进行
读取和写入:
1.读取数据,通过内存访问此磁盘的习惯,读取的是4kb整数倍,再缓冲到内存中
2.写入数据,首先把数据缓冲到内存中,攒够4kb以后。再写入磁盘中
二、IO流的分类
输入输出流
参照物是内存
I
Input 输入 从硬盘读取数据到内存里面。这是输入
O
Output 输出 从内存写入到硬盘。这是输出
处理方式:
字节 :是按照字节为单位处理当前文件
输入字节流: InputStream
输出字节流: OutputStream
字符 :首先是按照字节为单位进行处理文件,但是操作过程中会有解码的过程。
输入字符流:Reader
输出字符流:Writer
核心方法 :
read(); write();
缓冲流
所有的缓冲流都是没有读写能力,起到一个缓冲的作用。读写能力只能是字符流或者字节流字节输入缓冲
字节输入缓冲----对应字节输入流:BufferedInputStream
字节输出缓冲----对应字节输出流:BufferedOutputStream
字符流输入缓冲:BufferedReader
字符流输出缓冲:BufferedWriter
三、输入输出过程
字节输入流缓冲读取文件:
1、找到对应的文件,创建对应文件File类对象。
2、创建对应的File类对象的FileInputStream 文件输入字节流对象
3、使用FileInputStream这个对象创建对用的BufferedInputStream对象
4、使用read方法将磁盘上面的数据写入到内存(byte数组中)
5、关闭流 close()
示例:
import java.io.*;
/**
* @author wangbo
* @version 1.0
* @date 2021/3/18 10:03
*/
public class Demo1 {
public static void main(String[] args) throws IOException {
//1.创建对应的文件的File类的对象
File file = new File("c:/aaa/2.txt");
//2.创建对应的File类对象的FileInputStream 文件输入字节流对象
FileInputStream fis = new FileInputStream(file);
//3.使用FileInputStream这个对象创建对用的BufferedInputStream对象
BufferedInputStream bis = new BufferedInputStream(fis);
//4.读取数据(从磁盘读到内存中)
byte[] buf = new byte[1024* 4];
/**
* int read(byte[] buf); 最常用的
* buf: 是一个字节数组。该数组是1024的整数倍。缓冲数组。用来保存读取的数据的
* int:在读取的过程中,或者的字节个数。如果读取到文件的末尾,就会EOF -1
*
*/
int length = -1;
while((length = bis.read(buf)) != -1) {
System.out.println(length);
System.out.println(new String(buf, 0, length));
}
//5.g关闭
bis.close();
}
}
运行结果:
51
二二二二二
三三三三三
四四四四四
字节输出流缓冲写出文件:(从内存中写入到硬盘中)
1、找到对应的文件,创建对应文件File类对象。
2、创建一个FileOutputStream文件输出字节流对象
3、使用FileOutputStream这个对象创建对用的BufferedOutputStream对象
4、写入数据 write
5、关闭流
示例:
import java.io.*;
/**
* @author xue_yun_xiang
* @create 2021-03-18-17:47
*/
public class Demo3 {
public static void main(String[] args) throws IOException {
File file = new File("E:/JAVA/qianfeng/2.txt");
FileOutputStream fos = new FileOutputStream(file);
BufferedOutputStream bos = new BufferedOutputStream(fos);
/*
*写入数据
* write(byte[] )写一个字节数组到指定的磁盘中
* */
String s = "中午吃满汉全席";
String str = s;
byte[] bytes = str.getBytes();
bos.write(bytes);
bos.close();
}
}
运行结果:
字符输入流缓冲读取文件:
1、找到对应的文件 File类对象
2、创建FileReader对象字符输入流
3、根据FileReader对象创建BufferedReader 字符输入缓冲对象
4、读取数据
5、关闭流
示例:
import java.io.*;
/**
* @author xue_yun_xiang
* @create 2021-03-18-19:15
*/
public class Demo1 {
public static void main(String[] args) throws IOException {
//1.创建一个File对象
File file1 = new File("E:/JAVA/qianfeng/1.txt");
//2.创建FileReader字符输入流对象
FileReader fileReader = new FileReader(file1);
//3.创建一个字符缓冲输入流
BufferedReader bufferedReader = new BufferedReader(fileReader);
//3.读取文件
/*
int read():读取一个字符
int read(char[] buf):读取数据存入到char类型的数组里面并返回读到的字符的个数
String readLine():读取一行数据
*/
char[] chars = new char[1024];
int len = bufferedReader.read(chars);
System.out.println(new String(chars, 0, len));
//System.out.println(bufferedReader.readLine());
bufferedReader.close();
}
}
输出结果:
哈哈哈哈哈哈哈
哈哈哈哈哈哈哈
字符输出流缓冲写出文件:
1、找到对应的文件 File类对象
2、创建FileWriter对象字符输出流
3、根据FileWriter对象创建BufferedWriter 字符输出缓冲对象
4、写入数据
5、关闭流
示例:
import java.io.BufferedWriter;
import java.io.File;
import java.io.FileWriter;
import java.io.IOException;
/**
- @author xue_yun_xiang
- @create 2021-03-18-19:32
/
public class Demo2 {
public static void main(String[] args) throws IOException {
File file = new File(“E:/JAVA/qianfeng/2.txt”);
FileWriter fileWriter = new FileWriter(file);
BufferedWriter bw = new BufferedWriter(fileWriter);
/
1、void write(int char)写入一个字符到文件中
2、void write(char[] cbuf)写入一个字符数组到文件中
3、void write(char[] cbuf,int off,int len)写入一个字符数组到文件中,并且限制了开始和长度
4、void write(String str)写入一个字符串到文件中
5、void write(String str int off,int len)写入一个字符串到文件中,并限制了开始和长度
6、void newLine()换行写
*/
bw.write(“下午喝小米粥”);
bw.newLine();
bw.write(“反差有点,接受不了”);
bw.close();
}
}
运行结果:
【注意事项】:使用字节流处理图片音频视频等,不要用字符流有可能出错。字符流用来处理文本。
四、综合示例
复制一个视频文件
可能出现的问题:拒绝访问
原因:文件写出的时候必须指明具体的文件名,不能只是文件夹
import java.io.*;
/**
* @author xue_yun_xiang
* @create 2021-03-18-13:46
*/
public class Demo1 {
public static void main(String[] args) throws IOException {
copy1();
}
public static void copy1() throws IOException {
long start = System.currentTimeMillis();
BufferedInputStream bufferedInputStream = new BufferedInputStream(new FileInputStream(new File("E:/JAVA/1.avi")));
BufferedOutputStream bufferedOutputStream = new BufferedOutputStream(new FileOutputStream(new File("E:/JAVA/2.avi")));
byte[] b1 =new byte[1024];
int len;
while ((len = bufferedInputStream.read(b1)) != -1) {
bufferedOutputStream.write(b1,0,len);
}
bufferedOutputStream.close();
bufferedInputStream.close();
long end = System.currentTimeMillis();
System.out.println("time:" + (end - start));
}
}
输出结果:
time:1228