Java--缓冲流

缓冲流

  • BufferedInputStream
  • BufferedOutputStream
  • BufferedReader
  • BufferedWriter

缓冲流(处理流)
处理流:“套接”在已有流的基础上

缓冲流是在原有流的基础上,进行包装
作用:提供流的读取,写入的速度
提高读写速度的原因:内部提供了一个缓冲区

/**
 * 缓冲流
 * BufferedInputStream
 * BufferedOutputStream
 * BufferedReader
 * BufferedWriter
 *
 * 作用:提供流的读取,写入的速度
 * 提高读写速度的原因:内部提供了一个缓冲区
 * 
 */
public class Mybuffered {


    /**
     * 实现非文本文件的复制
     */
    @Test
    public void BufferedStreamTest(){
        FileInputStream fis= null;
        FileOutputStream fos= null;
        BufferedInputStream bis= null;
        BufferedOutputStream bos= null;
        try {
            //造文件
            File srcFile=new File("123.jpg");
            File destFile=new File("789.jpg");
            //节点流
            fis = new FileInputStream(srcFile);
            fos = new FileOutputStream(destFile);
            //缓冲流
            bis = new BufferedInputStream(fis);
            bos = new BufferedOutputStream(fos);

            //复制细节,读取,写入
            byte[] buf=new byte[1024];
            int len;
            while((len=bis.read(buf))!=-1){
                bos.write(buf,0,len);
                // bos.flush();//刷新缓冲区
            }
        } catch (IOException e) {
            e.printStackTrace();
        } finally {

            /**
             * 资源的关闭,要先关断外层流,再关内层流
             * 但是:我们关掉外层流时,也会关闭内层流,所以我们可以省略内层流的关闭
             */
            try {
                if (bis!=null)
                    bis.close();
            } catch (IOException e) {
                e.printStackTrace();
            }
            try {
                if(bos!=null)
                    bos.close();
            } catch (IOException e) {
                e.printStackTrace();
            }

        }


    }
}

1,和节点流不同的是,我们在使用缓存流时,要创建需要包装的流,读写操作是用的是缓冲流,具体看上面代码

2,为什么能提高读写呢?因为buffered类提供一个缓冲区容量为8192, 动态的.flush()。意思就是,原本当我们的缓冲区存储到了8192,就会打印刷新,但buffered会自动的刷新,把内存中的数据打印出去。

资源的关闭,要先关断外层流,再关内层流
但是:我们关掉外层流时,也会关闭内层流,所以我们可以省略内层流的关闭


接下来我们来操作文本文件:

  @Test
    public void textBuffered(){

        BufferedReader br= null;
        BufferedWriter bw= null;
        try {
            br = new BufferedReader(new FileReader(new File("hello.txt")));
            bw = new BufferedWriter(new FileWriter(new File("hello1.txt")));

///步骤3
            char[] cbuf=new char[1024];
            int len;
            while((len=br.read(cbuf))!=-1){
                bw.write(cbuf,0,len);
            }
//////
        } catch (IOException e) {
            e.printStackTrace();
        } finally {
            try {
                if (br!=null)
                    br.close();
            } catch (IOException e) {
                e.printStackTrace();
            }
            try {
                if(bw!=null)
                    bw.close();
            } catch (IOException e) {
                e.printStackTrace();
            }
        }
    }

没有特别大的区别:
但是我们的步骤三可以改写为:

  String data;
  while((data=br.readLine())!=null){
  		bw.write(data+"\n");
  		//bw.write(data);
  		//bw.newLine();
  }

注意.readLine()返回的不是-1,读到文件末尾返回的是null

readLine():意思是按行来读取,但是readLine()中不包含换行符,所以我们要加个“\n”,避免全部内容挤在一行

也可以用bw.write(data);
bw.newLine();(表示换行符)

发布了49 篇原创文章 · 获赞 0 · 访问量 1431

猜你喜欢

转载自blog.csdn.net/qq_43616001/article/details/104006853