6.3(java学习笔记)缓冲流

时间:2023-04-25 23:00:34

一、缓冲流

  使用缓冲流后的输入输出流会先存储到缓冲区,等缓冲区满后一次性将缓冲区中的数据写入或取出。

  避免程序频繁的和文件直接操作,这样操作有利于提高读写效率。

  缓冲流是构建在输入输出流之上的,可以理解为是对基本输入输出流的增强和扩展,但其根本是建立在输入输出流之上的。

  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