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

35人阅读 评论(0) 收藏 举报
分类:

简介

在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!

查看评论

Java IO流学习总结三:缓冲流-BufferedInputStream、BufferedOutputStream

Java IO流学习总结三:缓冲流 转载请标明出处:http://blog.csdn.net/zhaoyanjun6/article/details/54292148 本文出自【赵彦军的博客...
  • zhaoyanjun6
  • zhaoyanjun6
  • 2017-02-06 16:41:04
  • 2543

java中常用io流 BufferedInputStream和BufferedOutputStream

BufferedInputStream 为另一个输入流添加一些功能,即缓冲输入以及支持 mark 和 reset 方法的能力。在创建 BufferedInputStream 时,会创建一个内部缓冲区...
  • j_a_v_a_guan
  • j_a_v_a_guan
  • 2015-08-21 19:32:37
  • 503

测试了下BufferedOutputStream的理想缓存大小

在我那台戴尔学生本上,对文件写入1千万条hello,world用FileInputStream花了52秒。因为一般是写入在page cache,估计主要花的时间是频繁的系统调用。 使用Buffere...
  • jollyjumper
  • jollyjumper
  • 2014-03-29 19:15:10
  • 2384

Java中BufferedInputStream和BufferedOutputStream基本使用详解

BufferedInputStream的使用 BufferedInputStream:缓冲字节输入流,是一个高级流(处理流),与其他低级流配合使用。 构造方法//创建一个 BufferedInpu...
  • lyb1832567496
  • lyb1832567496
  • 2016-10-03 13:26:14
  • 12195

BufferedInputStream和BufferedOutputStream用法 解决乱码

转自点击打开链接 BufferedInputStream和BufferedOutputStream是过滤流,需要使用已存在的节点来构造,即必须先有InputStream或OutputStream,相...
  • hangelsing
  • hangelsing
  • 2015-03-11 19:21:43
  • 3789

java转换流、乱码之编码与解码

package com.bjsxt.io.convert; import java.io.UnsupportedEncodingException; public class ConverDemo...
  • damotiansheng
  • damotiansheng
  • 2015-05-19 10:05:49
  • 6376

BufferedInputStream与BufferedOutputStream用法简介

BufferedInputStream是带缓冲区的输入流,默认缓冲区大小是8M,能够减少访问磁盘的次数,提高文件读取性能;BufferedOutputStream是带缓冲区的输出流,能够提高文件的写入...
  • liaisuo
  • liaisuo
  • 2014-09-29 00:10:53
  • 36562

IO_缓冲流_转换流_字节转为字符_乱码分析_编码与解码JAVA152-154

IO_缓冲流_转换流_字节转为字符_乱码分析_编码与解码JAVA152-154
  • u013292493
  • u013292493
  • 2016-01-02 13:49:58
  • 1356

Android 缓存流(BufferedInputStream和BufferedOutputStream)

public class StreamUtils { public static void readData(InputStream is, OutputStream os) ...
  • ware00
  • ware00
  • 2017-04-20 19:33:48
  • 173

通过BufferedInputStream bufferedOutputStream读写文件

代码: import java.io.BufferedInputStream; import java.io.BufferedOutputStream; import java.io.ByteA...
  • rznice
  • rznice
  • 2015-03-14 16:14:04
  • 10265
    个人资料
    等级:
    访问量: 324
    积分: 155
    排名: 110万+
    文章存档
    最新评论