java之IO系列04——带缓存的输入/输出流

缓存是I/O的一种性能优化。缓存流为I/O流增加了内存缓存区。有了缓存区,使得在流上执行skip()、mark()和reset()方法都成为可能。

目录

1、BufferedOutputStream类和BufferedInputStream类

1.1 BufferedInputStream

 1.2 BufferedOutputStream

2、BufferedReader与BufferedWriter类

3、案例


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();
		}
	}
}

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值