缓存流 从何而来。在字符字节流的读取中,我们读取了e盘里的txt文件,e盘属于电脑上的硬盘介质。如果我们就读一次那没什么大影响,但是在真实的业务中,我们可能会遇到频繁往硬盘中读写文件内容。这是很浪费资源的。从操作系统的基础知识里面我们可以了解到 读取速率是 寄存器 》内存 》硬盘
所以缓存流就出现了,缓存流在读取的时候,会一次性读较多的数据到缓存中,以后每一次的读取,都是在缓存中访问,直到缓存中的数据读取完毕,再到硬盘中读取。 缓存流在写入数据的时候,会先把数据写入到缓存区,直到缓存区达到一定的量,才把这些数据,一起写入到硬盘中去。按照这种操作模式,就不会像字节流,字符流那样每写一个字节都访问硬盘,从而减少了IO操作
注意:缓存流必须在建立在现有的流基础上,这意味你必须先建一个字节/字符流对象。
public class BufferedReaderAndWrite {
public static void main(String[] args) {
File file = new File("e:/SCfile/serral.txt");
try (
FileReader fileReader = new FileReader(file);
BufferedReader bufferedReader = new BufferedReader(fileReader);
){
while (true){
String line =bufferedReader.readLine();
if(line==null) break;
System.out.println("line = " + line);
}
}catch (IOException e){
e.printStackTrace();
}
}
}
写入数据到文件:
这里注意2点:
1,如果你用bufferedwriter 那么要手动调用flush() 刷新数据:因为你的数据只写到了缓存流里面。FileWriter 并没有把它写到文件里面。(当然你可以每写一行 就调一次flush(),意思是直接往硬盘上的文件里面写。不在缓存区停留)
或者你可以用 PrintWriter 它自动刷新 不需要再调用flush()。
2,你往文件里面写的数据默认会覆盖掉文件里面的旧数据!如果你要追加写入,可以在 FileWriter fw = new FileWriter(file,true)构造时 声明为true
public class BufferedReaderAndWrite {
public static void main(String[] args) {
File file = new File("e:/SCfile/serral.txt");
try (
// 创建文件字符流
FileWriter fw = new FileWriter(file,true);//true为追加
// 缓存流必须建立在一个存在的流的基础上
PrintWriter pw = new PrintWriter(fw);
) {
pw.println("garen kill teemo");
} catch (IOException e) {
e.printStackTrace();
}
}
}