带缓存的输入输出流
缓存是IO的一种性能优化,缓存流为IO流增加了内存缓存区.有了缓存区,使得在流上执行skip(),market(),reset() 方法成为了可能--_--_-__--_===.
BufferedInPutStream和BufferedOutPutStream类
BufferedInPutStream类可以对所有的InPutStream类进行带缓存区的包装,以达到性能的优化.BufferedInPutStream类提供了两个构造方法:
-- BufferedInPutStrem(InPutStream in)
-- BufferedInPutStream(InputStreamin,int size)
第一种形式的构造方法创建了一个带有32个字节的缓存流;第二种构造方法按指定的大小(字节)来构造缓存流.
BufferedInputStream的作用是为其他输入流提供缓冲功能,创建BufferedInPutStream时,我们会通过它的构造函数指定某个输入流为参数, BufferedInPutStream会将该输入流数据分批读取,每次读取一部分带缓冲区中,操作完缓冲区的这一部分数据后,在从输入流中读取下一部分数据.
为什么需要缓冲区呢?原因很简单:效率问题!缓冲区的数据实际上上是保存在内存中,而原始数据可能保存在硬盘等存储介质中,而我们知道,从内存中读取数据的速度比从硬盘中读取数据的速度至少快10倍以上.那为什么不一次把全部数据都读取到缓冲区呢,
第一:读取全部数据可能需要的时间比较长,
第二:内存价格很贵且不想硬盘那样容量很大.
文件 |
目的地 |
InPutStream |
BufferedInPutStrem |
import java.io.BufferedReader;
import java.io.BufferedWriter;
import java.io.File;
import java.io.FileNotFoundException;
import java.io.FileReader;
import java.io.FileWriter;
import java.io.IOException;
public class BUfferedTest2 {
/**
* 本实例向指定的磁盘文件中写入数据,并通过BufferedReader类将文件中的信息分行显示.
*
*/
public static void main(String[] args) throws IOException {
//定义一个字符数组
String []str={"我是小雨","我爱你","你爱我吗?"};
//创建文件对象
File f=new File("G://word3.txt");
//创建FileWriter对象
FileWriter fw=new FileWriter(f);
//创建BufferedWriter对象
BufferedWriter bw=new BufferedWriter(fw);
//遍历循环数组
for(int k=0;k<str.length;k++){
bw.write(str[k]);//将字符串数组中的元素写入到磁盘文件中
bw.newLine();//将数组中的元素以单行的形式写入磁盘文件
}
bw.flush();
bw.close();
fw.close();
// 读取文件
//创建FileReader流
FileReader fe=new FileReader(f);
//创建BufferedReader缓冲区
BufferedReader br=new BufferedReader(fe);
String s=null;
int i=0;
while((s=br.readLine())!=null){
i++;
System.out.println("第"+i+"行是:"+s);//输出文件数据
}
fe.close();
br.close();
}
}
BufferedInPutStrem读取文件的过程
使用BufferedOutPutStream输出信息和使用BufferedInPutStream输入信息完全一样,只不过BufferedOutPutStrem类有一个flush()方法来将缓存区的数据强制输出完.(flush()方法就是用来即使在缓存区没有慢的情况下也可以继将其强制写入到外设,习惯上成这个过程为刷新flush()方法只对使用缓存区的OutPutStream类的子类有效,当调用close()方法时,系统在关闭流之前,也会将缓存区的内容刷新到磁盘中)
BufferedReader与BufferedWriter类
BufferedReader类与BufferedWritre类分别继承自Reader类和Writer类.这两个类具有相同的内部缓存机制,并可以以行尾单位进行输入输出.
字符数据 |
根据BufferedReader类的特点,总结出如图琐事的字符数据读取文件的过程.
BufferedReader |
OutPutStreamWriter |
OutPutStream |
文件 |
BufferedReader类读取文件的过程
BufferedReader类常用的方法如下:
【1】read()方法.读取单个字节
【2】ReadLine()方法.读取一个文本行,并将其返回为字符串,若无字符串可读,则返回null.
BufferedWriter类中的方法都返回void.常用的方法如下:
【1】write(String s,int off,int len)方法,写入字符串的某一部分.
【2】Flush()方法.刷新该流的缓存.
【3】nextLine()方法.写入一个行分隔符.
在使用BufferederWriter累的write()方法时,数据并没有立即被写入输出流,而是首先进入缓存区中.如果想立即将缓存区中的数据写入输出流.一定要调用flush()方法刷新该缓存流.