首先:
缓存流的出现是由于字节流与字符流在每次进行读写操作的时候都会去访问硬盘
如果读写的频率比较高的时候,其性能表现不佳,存在弊端。
在C语言中也曾提到过输入缓存区的概念。其实和这个意思大致相同。
那么缓存就是一个临时的数据放置区域 建立缓存流能够避免这一弊端——将大量的数据暂存于此 之后一并和硬盘进行操作(读写) 读写完之后 再对硬盘进行访问
因此在访问的时候 由于建立了缓存流 首先访问的就是缓存流。 依照这样的模式 就不会像字节流和字符流那样每读写一个字节都得访问硬盘 都得进行IO操作。
一、缓存流分输出流的缓存流和输入的缓存流
便于理解输入输出再次声明——输入输出的概念的对象角度是站在程序员来看的 我们去写入就是输出 去编码读取就是输入——它向我们输入
1、使用缓存流读取数据:
缓存字符输入流 BufferedReader 可以一次读取一行数据
其声明形式为:import java.io.BufferedReader;
注意:缓存流的创建是建立在一个存在的流上的
File f = new File("d:/lol.txt");
try (
FileReader f1= new FileReader(f);
BufferedReader br = new BufferedReader(f1);
)
{
while (true) {
// 一次读一行
String line = br.readLine();
if (null == line)
break;
System.out.println(line);
}
} catch (IOException e) {
e.printStackTrace();
}
2、使用缓存流写出数据
PrintWriter 缓存字符输出流, 可以一次写出一行数据
声明形式:import java.io.PrintWriter;
// 向文件lol2.txt中写入三行语句
File f = new File("d:/lol2.txt");
try (
FileWriter fw = new FileWriter(f)
PrintWriter pw = new PrintWriter(fw);
) {
pw.println("garen kill teemo");
pw.println("teemo revive after 1 minutes");
pw.println("teemo try to garen, but killed again");
} catch (IOException e) {
e.printStackTrace();
}
3、flush
在PrintWriter这个类中 存在方法flush 该方法的用法在于将其写入的内容强制写入硬盘不管缓存是否满 这个可用于需要把某些数据立即写入硬盘时才采取的操作。
具体写法:
File f =new File("d:/lol2.txt");
try(FileWriter fr = new FileWriter(f);PrintWriter pw = new PrintWriter(fr);) {
pw.println("garen kill teemo");
//强制把缓存中的数据写入硬盘,无论缓存是否已满
pw.flush();
pw.println("teemo revive after 1 minutes");
pw.flush();
pw.println("teemo try to garen, but killed again");
pw.flush();
} catch (IOException e) {
e.printStackTrace();
}
最后:
除了缓存字符输入(输出)流 还有缓存字节输入(输出)流
以下:
字节缓冲输出流:BufferedOutputStream
字节缓冲输入流:BufferedInputStream
用法是一致的。