在劫

吾生也有涯,而知也无涯 。

  博客园 :: 首页 :: 博问 :: 闪存 :: 新随笔 :: 联系 :: 订阅 订阅 :: 管理 ::

BufferedInputStream和BufferedOutputStream这两个类分别是FilterInputStream和FilterOutputStream的子类,作为装饰器子类,使用它们可以防止每次读取/发送数据时进行实际的写操作,代表着使用缓冲区.
不带缓冲的操作,每读一个字节就要写入一个字节,由于涉及磁盘的IO操作相比内存的操作要慢很多,所以不带缓冲的流效率很低。带缓冲的流,可以一次读很多字节,但不向磁盘中写入,只是先放到内存里。等凑够了缓冲区大小的时候一次性写入磁盘,这种方式可以减少磁盘操作次数,速度就会提高.
BufferedOutputStream要调用flush()方法或close()方法,强行将缓冲区中的数据写出。否则可能无法写出数据。之后的BufferedReader和BufferedWriter与此类似。
BufferedInputStream 是缓冲输入流。它继承于FilterInputStream
BufferedInputStream 的作用是为另一个输入流添加一些功能,例如,提供“缓冲功能”以及支持mark()标记和reset()重置方法
BufferedInputStream 本质上是通过一个内部缓冲区数组实现的

public class BufferedInputStreamJava {

	public static void main(String[] args) throws Exception {
		// TODO Auto-generated method stub
		String strFile = "d:" + File.separator + "javatest" + File.separator + "IO_RandomAccessFileTest.txt";
		File f = new File(strFile);
		FileInputStream fis = new FileInputStream(f);
		BufferedInputStream bis = new BufferedInputStream(fis);
		byte[] b = new byte[1024];
		//注意:这里定义了result,用于返回读取到的字节个数
		//在使用读到的字节数组的时候,如果没有result组装成String类输出的时候会有乱码
		//这个时候组装的是缓存的byte数组,而这个数组最后的时候往往没有读满
		int result = 0;
		while((result = bis.read(b)) != -1) {
			System.out.println(new String(b, 0, result));
			//new String(b) 这里会正确输出读到的数据,但是后面有大量乱码符号
		}
		bis.close();
		fis.close();
	}
}
public class BUfferedOutputStream {

	public static void main(String[] args) throws Exception {
		// TODO Auto-generated method stub
		String strFile = "d:" + File.separator + "javatest" + File.separator + "IO_RandomAccessFileTest.txt";
		File f = new File(strFile);
		//true代表续写到文件尾
		FileOutputStream fos = new FileOutputStream(f, true);
		BufferedOutputStream bos = new BufferedOutputStream(fos);
		// \r\n换行
		byte[] StrB1 = "写入数据1...\r\n".getBytes();
		bos.write(StrB1);
		bos.flush();
		byte[] StrB2 = "写入数据2...".getBytes();
		bos.write(StrB2);
		//bos.close()没有关闭或者flush()的话,数据只会到缓冲区,不会到文件中
		bos.close();
		fos.close();
	}

}
posted on 2018-07-07 15:45  长嘴大耳怪  阅读(134)  评论(0编辑  收藏  举报