BufferedInputStream和BufferedOutputStream字节缓存流及字符缓存流的使用

版权声明: https://blog.csdn.net/Chianz632/article/details/79974425

简介

在IO流里面有4个缓存流,分别是:BufferedInputStream,BufferedOutputStream,BufferedReader,BufferedWriter。当我们用read()读取文件时,每读一个字节,访问一次硬盘,效率很低。就算用到read(byte [ ])每次读取多个字节,当文件过大时,操作起来也不是很方便。因此我们需要用到buffer缓存流,当创建buffer对象时,会创建一个缓冲区数组。当我们读一个文件时,先从硬盘中读到缓冲区,然后直接从缓冲区输出即可,效率会更高。写文件也类似。

有无缓冲区效率的比较,以字节流为列。

package Buffer;
import java.io.*;
/**
 * 字节缓冲流
 */
public class Buffer_byte {
    public static void main(String[] args) throws IOException {
        File file=new File("Buffer");
        //缓冲流
        BufferedInputStream bfis=new BufferedInputStream(new FileInputStream(file));
        int temp=0;
        long time=System.currentTimeMillis();//获取当前时间至1970-1-1的毫秒数
        while ((temp=bfis.read())!=-1){
//            System.out.print((char) temp);
        }
        time=System.currentTimeMillis()-time;
        bfis.close();
        System.out.println("缓冲流读:"+time+"ms");

        //非缓冲
        FileInputStream fis=new FileInputStream(file);
        temp=0;
        time=System.currentTimeMillis();
        while ((temp=fis.read())!=-1){
//            System.out.print((char) temp);
        }
        time=System.currentTimeMillis()-time;
        fis.close();
        System.out.println("非缓冲区读:"+time+"ms");
    }
}

结果:


以上代码我们只读不输出,显然使用缓冲区的效率要高。

字节缓冲流和字符缓冲流

字节缓冲流:BufferedInputStream,BufferedOutputStream。字符缓冲流:BufferedReader,BufferedWriter。在使用不同的缓冲流,我们传入的参数也是不同的。在字节缓冲流中,我们需要传入基于字节的输入输出流。字符流中也是一样。如果我们需要在字符流中对字节流进行操作呢?IO里面刚好有两个转换流:InputStreamReader和OutputStreamWriter,将字节流转换为字符流,以便我们在字符缓冲里面操作字节流。

字节缓冲流BufferedInputStream和BufferedOutputStream实现文件拷贝

package Buffer;

import java.io.*;

public class Buffer_Stream_Copy {
    public static void main(String[] args) throws IOException {
        File file=new File("buffer.txt");
        if(!file.isFile()){   return;   }
        BufferedInputStream bfis=new BufferedInputStream(new FileInputStream(file));
        BufferedOutputStream  bfos=new BufferedOutputStream(new FileOutputStream("src\\"+file.getName()));//copy到src目录下
        byte bytes[]=new byte[1024];
        int temp=0;      //边读边写
        while ((temp=bfis.read(bytes))!=-1){//读
            bfos.write(bytes,0,temp);   //写
        }
        bfos.flush();
        bfos.close();
        bfis.close();
        System.out.println("copy成功!");
    }
}

字符缓冲流BufferedReader和BufferedWriter实现文件拷贝

package Buffer;

import java.io.*;

public class Buffer_Char_Copy {
    public static void main(String[] args) throws IOException{
        File file=new File("buffer.txt");
        //转换流
//        BufferedReader br=new BufferedReader(new InputStreamReader(new FileInputStream(file)));
        BufferedReader br=new BufferedReader(new FileReader(file));
//        BufferedWriter bw=new BufferedWriter(new OutputStreamWriter(new FileOutputStream("src\\"+file.getName())));
        BufferedWriter bw=new BufferedWriter(new FileWriter("src\\"+file.getName()));
        String temp=null;
        while ((temp=br.readLine())!=null){//每次读取一行数据  如果没有则返回空
            bw.write(temp);    
            bw.newLine();//换行     读一行换一行   
        }
        bw.flush();
        br.close();
        bw.close();
        System.out.println("Copy完成!");
    }
}

当我们使用字符缓冲流时,每次从缓冲区读取一行放入temp中,然后写入,在写入过程中并不包含"\n"换行,所以需要我们调用缓冲流中的newLine()进行换行,否则字符都会连在一起。


       每日鸡汤:记住该记住的,忘记该忘记的。改变能改变的,接受不能改变的!


 Over!

阅读更多
想对作者说点什么?

博主推荐

换一批

没有更多推荐了,返回首页