目录
2.1 字节缓冲输入流(BufferedInputStream)和输出流(BufferedOutputStream)
上两篇文章我们学习到了字节流-输入流(Inpustream)、输出流(OutputStream)
字符流-输入流(FileReader)、输出流(FileWriter)。这些都是非常基础的原始流。
下面我们来学习一下包装流之---缓冲流Buffered
1、什么是缓冲流?
对原始流进行包装,以提高原始流读写数据的性能。
在内存中给定一个缓冲区。先开辟一块缓冲区的大小(默认8k,可以自己更改)
我们写出数据的时候,先把数据写到缓冲区(由于缓冲区在内存中,程序操作内存是非常快的),缓冲区装满数据之后,再把缓冲区的数据写出到目标文件(目标文件在硬件中,程序操作硬件是非常消耗资源的),这样可以减少程序和硬件资源的交互次数,提高程序效率。

2、代码演示
2.1 字节缓冲输入流(BufferedInputStream)和输出流(BufferedOutputStream)
必须要先定义原始流和文档做连接,缓冲流只是在原始流的基础上包装缓冲区从而提高性能。
用法和原始流也是非常类似。
public class BufferInpuStreamTest1 {
public static void main(String[] args) {
try (
InputStream fileInputStream = new FileInputStream("src/main/resources/aaa.txt"); //先定义一个原始字节输入流
BufferedInputStream inBuffer = new BufferedInputStream(fileInputStream);//再定义一个包装流来包装原始输入流
OutputStream outputStream = new FileOutputStream("src/main/resources/bbb.txt");//先定义一个原始字节输出流
BufferedOutputStream outBuffer = new BufferedOutputStream(outputStream);//再定义一个包装流来包装原始输出流
) {
byte[] buffer = new byte[1024]; //定义一个水桶,表示一次往包装流中装多少字节
int len;
while ((len = inBuffer.read(buffer)) != -1){
outBuffer.write(buffer,0,len);
}
}catch (Exception e){
e.printStackTrace();
}
}
}
我们可以看到,这段程序把aaa.txt文件内容拷贝到了bbb.txt


字节流适用于文件复制类的业务(图片、视频、文本皆可操作),字符流适合操作纯文本类的文件
2.2 字符缓冲输入流(BufferedReader)
相比较于原始字符输入流,新增了一个按行读取的方法.readLine();
在以后的开发中,用字符缓冲流一行一行读取代码,是非常普遍应用的
public class BufferReaderTest1 {
public static void main(String[] args) {
try (
Reader fileReader = new FileReader("src/main/resources/aaa.txt"); //先定义一个原始字符输入流
BufferedReader inBuffer = new BufferedReader(fileReader);//再定义一个包装流来包装原始输入流
) {
String line;
while ((line = inBuffer.readLine()) != null){ //当读取不到数据的时候,会返回null,表示文件读取结束
System.out.println(line);
}
}catch (Exception e){
e.printStackTrace();
}
}
}
我们可以看到,这段程序把aaa.txt文件按行读取并打印到了控制台上


2.3 字符缓冲输出流(BufferedWriter)
相比较于原始字符输出流,新增了一个换行的方法.newLine();
字符缓冲输出流其实内置也有一个缓冲区,但是不是特别大。
public class BufferReaderTest1 {
public static void main(String[] args) {
try (
Writer fileWriter = new FileWriter("src/main/resources/bbb.txt"); //先定义一个原始字符输入流
BufferedWriter inBuffer = new BufferedWriter(fileWriter);//再定义一个包装流来包装原始输入流
) {
inBuffer.write('a');
inBuffer.write('你');
inBuffer.write(97);
inBuffer.newLine(); //换行
inBuffer.write("我爱中国!!!");
}catch (Exception e){
e.printStackTrace();
}
}
}
我们可以看到,我们向文本中写入了字符。

3、源码分析
我们以BufferedInputStream为例,看到源码里面定义了一个缓冲内存区, 大小为8kb

8192字节= 8kb
扩展:
1byte(一个字节) = 8bit(八位,也叫八个比特位,由0或1表示一个位,表示信息量的最小单位)
1kb = 1024byte
在计算机中,字节(byte)是最小的存储单位,常用于衡量硬盘容量、文件大小等。


我们可以自己修改这个缓冲区的大小,只需要在创建BufferedInputStream时加一个参数给定缓冲区大小即可。

3、总结
缓冲流把原始流包装了一下,以提高传输数据的性能。
必须要先定义原始流和文档做连接,缓冲流在原始流的基础上包装一个缓冲区,大小默认8kb,我们可以自行修改。
缓冲流用法和原始流也是非常类似的。
相比较于原始流,字符缓冲输入流(BufferedReader)新增了一个按行读取的方法.readLine();字符缓冲输出流(BufferedWriter)新增了一个换行的方法.newLine(),在日常开发中非常实用。
注意:缓冲区大小不是越大越好,因为缓冲区也是在内存中开辟的,开辟太大会占用内存,性能反而会下降。下一篇做性能压测,给同学们讲解一下这个知识点。
这就是我对缓冲流的理解,希望能帮到大家,有问题的地方欢迎大家一起讨论!
后续会不断更新作品,欢迎大家一起讨论学习。❤❤❤
:缓冲流---BufferedInputStream、BufferedOutputStream、BufferedReader、BufferedWriter。&spm=1001.2101.3001.5002&articleId=143849384&d=1&t=3&u=c5a3b7706a5d4aa48a7cccdd52ab4ab0)
1633

被折叠的 条评论
为什么被折叠?



