缓存是I/O的一种性能优化。缓存流为I/O流增加了内存缓存区。有了缓存区,使得在流上执行skip()、mark()和reset()方法都成为可能。
目录
1、BufferedOutputStream类和BufferedInputStream类
2、BufferedReader与BufferedWriter类
1、BufferedOutputStream类和BufferedInputStream类
1.1 BufferedInputStream
BufferedInputStream 是缓冲输入流。它继承于FilterInputStream。BufferedInputStream类可以对所有InputStream类进行带缓存区的包装以达到性能的优化。BufferedInputStream 的作用是为另一个输入流添加一些功能,例如,提供“缓冲功能”以及支持“mark()标记”和“reset()重置方法”。BufferedInputStream 本质上是通过一个内部缓冲区数组实现的。创建时,将创建一个内部缓冲区数组。当读取或跳过流中的字节时,根据需要从包含的输入流重新填充内部缓冲区,一次填充多个字节。该操作会记住输入流中的一个点,并且该操作会在从包含的输入中获取新字节之前,重新读取自最近一次操作以来读取的所有字节。
构造方法:
BufferedInputStream(InputStream in) //创建了一个带有32个字节的缓存流
BufferedInputStream(InputStream in, int size) //创建一个具有指定大小的缓冲区
从构造方法可以看出,BufferedInputStream对象位于InputStream类对象之前。字节数据读取文件的过程如图所示:

1.2 BufferedOutputStream
使用BufferedOutputStream输出信息和用OutputStream输出信息完全一样,只不过BufferedOutputStream有一个flush()方法用来将缓存区的数据强制输出完。flush()方法就是用于即使在缓存区没有满的情况下,也将缓存区的内容强制写入到外设,习惯上称这个过程为刷新。flush()方法只对使用缓存区的OutputStream类的子类有效。当调用close()方法时,系统在关闭流之前,也会将缓存区中的信息刷新到磁盘文件中。
构造方法:
BufferedOutputStream(OutputStream out) //创建一个新的缓冲输出流,将数据写入到指定的基本输出流中。
BufferedOutputStream(OutputStream out, int size) //创建一个新的缓冲输出流,用指定的缓冲区大小写数据到指定的基本输出流中。
2、BufferedReader与BufferedWriter类
BufferedReader类与BufferedWriter类分别继承Reader类与Writer类。这两个类同样具有内部缓存机制,并可以以行为单位进行输入/输出。
BufferedReader常用方法:
void close() //关闭流并释放与它相关联的任何系统资源。
Stream<String> lines() //返回一个 Stream,其中的元素是线从这 BufferedReader读。
void mark(int readAheadLimit) //标记流中的当前位置。
boolean markSupported() //判断是否流支持的mark()操作,即标记操作。
int read() //读取单个字符。
int read(char[] cbuf, int off, int len) //将字符读入一个数组的一部分。
String readLine() //读一行文本。
boolean ready() //告诉是否该流已准备好阅读。
void reset() //将流到最近的标记。
long skip(long n) //跳过的字符。
BufferedWriter常用方法:
void close() //关闭流。
void flush() //刷新流
void newLine() //写行分隔符
void write(char[] cbuf, int off, int len) //写入一个字符数组的一部分。
void write(int c) //写一个字符。Write()方法时,数据并没有立刻被写入输出流,而是首先进入缓存区中。
//如果想立刻将缓存区中的数据写入输出流,一定要调用flush()方法。
void write(String s, int off, int len) //写入字符串的一部分。
3、案例
import java.io.BufferedReader;
import java.io.BufferedWriter;
import java.io.File;
import java.io.FileReader;
import java.io.FileWriter;
import java.io.IOException;
public class BufferedTest {
public static void main(String[] args)
{
String song[] = {"太阳当空照,花儿对我笑,小鸟说早早早,你为什么背上了小书包"};
File file = new File("E:/dir/o.txt");
try {
FileWriter fw = new FileWriter(file);
BufferedWriter bufw = new BufferedWriter(fw);
for(int i =0;i<song.length;i++) {//循环遍历数组
bufw.write(song[i]); //将字符串写入到磁盘文件中,要注意这里有缓存
bufw.newLine(); //将字符串数组中的元素以单行的形式写入文件
}
bufw.close();//关闭流,此时全部写入了
fw.close();
}catch(IOException e) {
e.printStackTrace();
}
try {
FileReader fr = new FileReader(file);
BufferedReader bufr = new BufferedReader(fr);
for(int j=0;j<3;j++)
{
if(bufr.ready())//判断是否可读
{
int tmp = bufr.read();//读取下一个字符
System.out.printf("%d : %c\n",j,tmp);//依次输出
}
}
if(fr.markSupported())//若支持标记
{
bufr.mark(1024);//标记当前位置
bufr.skip(4);//跳过4个字符
bufr.reset();//重置到标记位置
char[] buf = new char[5];
bufr.read(buf,0,5);//读取5个字符
System.out.printf("%s\n", String.valueOf(buf));
}
else //不支持标记
{
System.out.println("make not supported!");
bufr.skip(4);//跳过4个字符
char[] buf = new char[5];
bufr.read(buf,0,5);//读取5个字符
System.out.printf("%s\n",String.valueOf(buf));
System.out.printf("%s\n",bufr.readLine());//读取该行剩余的数据
}
bufr.close();
fr.close();
}catch(IOException e) {
e.printStackTrace();
}
}
}
1538

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



