一、缓冲流
使用缓冲流后的输入输出流会先存储到缓冲区,等缓冲区满后一次性将缓冲区中的数据写入或取出。
避免程序频繁的和文件直接操作,这样操作有利于提高读写效率。
缓冲流是构建在输入输出流之上的,可以理解为是对基本输入输出流的增强和扩展,但其根本是建立在输入输出流之上的。
1.字节缓冲流
1.1字节缓冲流类
BufferInputStream
BufferOutputStream
1.2.构造方法:
传递参数为输入、输出流对象。
BufferedInputStream(InputStream in)//构造方法,创建一个缓冲流,保存其参数(输入流),供后续使用
BufferedInputStream(InputStream in, int size)//创建一个缓冲流,size为设置缓冲区大小
BufferedOutputStream(OutputStream out)//创建输出缓冲流
BufferedOutputStream(OutputStream out, int size)//size为缓冲区大小
1.3.例子
给输入输出流加上缓冲流后,其基本功能和方法并没有改变,只是改变了读写所采取的策略,基本方法和操作方式没有发生变化。
import java.io.BufferedInputStream; import java.io.BufferedOutputStream; import java.io.File; import java.io.FileInputStream; import java.io.FileNotFoundException; import java.io.FileOutputStream; import java.io.FileReader; import java.io.FileWriter; import java.io.Flushable; import java.io.IOException; import java.io.InputStream; import java.io.OutputStream; import java.io.Reader; import java.io.Writer; public class Test { public static void main(String[] args){ String pathW = "F:\依风\Desktop\writer.txt"; String pathR = "F:\依风\Desktop\reader.txt";//此处的reader.txt中要有数据 File fr = new File(pathR); File fw = new File(pathW); InputStream r = null; OutputStream w = null; InputStream bufferR = null; OutputStream bufferW = null; try { int c = 0; r = new FileInputStream(fr); w = new FileOutputStream(fw); bufferR = new BufferedInputStream(r);//将输入输出流加上缓冲 bufferW = new BufferedOutputStream(w); try { while(-1 != (c = bufferR.read())){//读一个字符 bufferW.write(c); System.out.print((char)c); } bufferW.flush();//将缓冲区剩余数据写入 } catch (IOException e) { // TODO Auto-generated catch block e.printStackTrace(); } } catch (FileNotFoundException e) { // TODO Auto-generated catch block e.printStackTrace(); }finally{ try { bufferW.close();//关闭资源 bufferR.close(); r.close(); w.close(); } catch (IOException e) { // TODO Auto-generated catch block e.printStackTrace(); } } } }
运行结果:
BufferedStream
2.字符缓冲流
2.1字符缓冲流类
BufferedWriter
BufferedReader
2.2构造方法
BufferedWriter(Writer out)
BufferedWriter(Writer out, int sz)
创建字符缓冲流,sz为指定缓冲区大小。
BufferedReader(Reader in)
BufferedReader(Reader in, int sz)
2.3新增方法
BufferedWtriter:void newLine()//写入行分隔符,简单的说就是加上回车换行
BufferedReader:String readLine()//读取一行,以字符串形式返回读取内容。如果已到末尾返回null
有一点需要注意,这里的新增方法在它们的父类(Wtriter,Reader)中并没有,所以需要使用这些方法时不能发生多态。
3.4例子
import java.io.BufferedInputStream; import java.io.BufferedOutputStream; import java.io.BufferedReader; import java.io.BufferedWriter; import java.io.File; import java.io.FileInputStream; import java.io.FileNotFoundException; import java.io.FileOutputStream; import java.io.FileReader; import java.io.FileWriter; import java.io.Flushable; import java.io.IOException; import java.io.InputStream; import java.io.OutputStream; import java.io.Reader; import java.io.Writer; public class Test { public static void main(String[] args){ String pathW = "F:\依风\Desktop\writer.txt"; String pathR = "F:\依风\Desktop\reader.txt";//该文件必须已有数据 /*此时该文件中的数据: *BufferedStream *BufferReader *BufferWriter * */ File fr = new File(pathR); File fw = new File(pathW); Reader r = null; Writer w = null; BufferedReader bufferR = null;//此处使用的BufferedReader、BufferedWtriter中独有的方法 BufferedWriter bufferW = null;//故不能发生多态,所有不能使用Reader或Writer try { String str; r = new FileReader(fr); w = new FileWriter(fw); bufferR = new BufferedReader(r);//将输入输出流加上缓冲 bufferW = new BufferedWriter(w); try { while(null != (str = bufferR.readLine())){//读一行 bufferW.write(str);//将读取的字符串写入 bufferW.newLine();//写入换行分隔符,即回车 System.out.println(str);//输出读取和写入的数据 } bufferW.flush();//将缓冲区剩余数据写入 } catch (IOException e) { // TODO Auto-generated catch block e.printStackTrace(); } } catch (IOException e) { // TODO Auto-generated catch block e.printStackTrace(); }finally{ try { bufferW.close();//关闭资源 bufferR.close(); r.close(); w.close(); } catch (IOException e) { // TODO Auto-generated catch block e.printStackTrace(); } } } }
运行结果: BufferedStream BufferReader BufferWriter