![e1942da11c971f2b73e37a90a5eab44c.png](https://img-blog.csdnimg.cn/img_convert/e1942da11c971f2b73e37a90a5eab44c.png)
第三节 缓冲流
2.1缓冲字节BufferedInputStream和BufferedOutputStream
【示例6】复制文件(使用缓冲流字节流提高效率)
public class TestCopy5 {
public static void main(String[] args) throws IOException {
//1.创建一个输入流和输出流
InputStream fis =
new FileInputStream(new File("e:/JDK_API.CHM"));
OutputStream fos =
new FileOutputStream(new File("e:/JDK_API2.CHM"));
//默认输入缓冲区大小8192
BufferedInputStream bis = new BufferedInputStream(fis);
//默认输出缓冲区大小8192
BufferedOutputStream bos = new BufferedOutputStream(fos);
//2.使用输入流和输出流完成文件复制
//2.1准备一个中转站(水杯)
int n;
//2.2先读一个字节
n = bis.read();//读取一个字节,赋给n
while(n != -1){
//在控制台显示该字节
//System.out.println((char)n);
//2.3再写一个字节
bos.write(n);
//2.4在读一个字节
n = bis.read();
}
//3.关闭输入流和输出流
//bos.flush();
bis.close();
bos.close();
}
}
• 缓冲流的原理 内部有一个类型为byte 长度默认是8192的数组 作为缓冲区
• 只要关闭高层流即可,底层流不用手动关闭;因为高层的关闭方法就是把底层流关闭
• 如何刷新输出缓冲区(让缓冲区内容写入硬盘,保证一致)
• 满了就自动刷新
• bos.close() 先flush,再关闭
• 手动刷新 flush()
2.2缓冲字符流BufferedReader和BufferedWriter
• 问题:之前的文件读写都是按照字节、字符或者数组来实现的,对于文本文件而言,能否按照行,一行行读写呢。
• 提供了BufferedReader和BufferedWriter实现按行读写
【示例7】复制文件(按行读写)
public class TestCopy6 {
public static void main(String[] args) throws IOException {
//创建两个流
BufferedReader br =
new BufferedReader(new FileReader(new File("e:/sqlnet.log")));
BufferedWriter bw =
new BufferedWriter(new FileWriter("e:/sqlnet2.log"));
//使用两个流完成按行读取的功能
//中转站就是一个字符串,存储一行数据
//先读一行
String str = br.readLine();
while(str != null ){
//再写一行
bw.write(str);
//bw.write("rn");不同操作系统中换行符是不同的
bw.newLine();
//再读一行
str = br.readLine();//!!!
}
//关闭两个流
br.close();
bw.close();
}
}
总结1:BufferedReader和BufferedWriter的优点
1.速度快
2.简化编程
总结2:readLine()底层的原理
底层还是一个一个字符的读取,append()放入到StringBuilder(或者char[] )中,
遇到换行符 ,将StringBuilder(char[])转换成String并返回
总结3:不同的操作系统中换行符是不同的
Unix系统里,每行结尾只有“<换行>”,即“n”;
Windows系统里面,每行结尾是“<回车><换行>”,即“rn”;
Mac系统里,每行结尾是“<回车>”,即“r”。
本节需知
1. 缓冲流的原理
2. BufferedReader的readLine()方法的原理
3. 使用缓冲字节流复制文件
4. 使用缓冲字符流按行复制文件