Java字节缓冲流和字符缓冲流学习

1、字节缓冲流

首先要明确一个概念:对文件或其他目标频繁的读写操作,效率低,性能差。
使用缓冲流的好处是,能够高效的读写信息,原理是将数据先缓冲起来,然后一起写入或者读取出来。

BufferedInputStream:为另一个输入流添加一些功能,在创建BufferedInputStream时,会创建一个内部缓冲区数组,用于缓冲数据。
BufferedOutputStream:通过设置这种输出流,应用程序就可以将各个字节写入底层输出流中,而不必针对每次字节写入调用底层系统。

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.IOException;
import java.io.InputStream;
import java.io.OutputStream;

/**
* 缓存的目的:解决写入文件操作时,频繁的操作文件所带来的性能降低的问题
* BufferedOutputStream内部默认的缓存大小是8kb,每次写入时存储到缓存中的byte数组中, 会把数组中的数据写入文件,并且下标归零
*/
public class BufferedStreamDemo {

	public static void main(String[] args) {
		byteWriter();
		byteReader();
	}

	private static void byteReader() {
		File file = new File("F:/test.txt");
		try {
			InputStream in = new FileInputStream(file);

			// 构造一个字节缓冲流
			BufferedInputStream bis = new BufferedInputStream(in);
			byte[] flush = new byte[1024];
			int len = -1;
			while ((len = bis.read(flush)) != -1) {
				System.out.println(new String(flush, 0, len));
			}
			bis.close();
		} catch (FileNotFoundException e) {
			e.printStackTrace();
		} catch (IOException e) {
			e.printStackTrace();
		}
	}// byteReader

	private static void byteWriter() {
		File file = new File("F:/test.txt");

		try {
			OutputStream out = new FileOutputStream(file, true);
			BufferedOutputStream bos = new BufferedOutputStream(out);

			String info = "你爱Java吗?";
			bos.write(info.getBytes());
			bos.close();
		} catch (FileNotFoundException e) {
			e.printStackTrace();
		} catch (IOException e) {
			e.printStackTrace();
		}
	}// byteWriter
}

2、字符缓冲流

BufferedReader:从字符输入流中读取文本,缓冲各个字节,从而实现字符、数组和行的高效读取。
BufferedWriter:将文本写入字符输出流,缓冲各个字符,从而提供单个字符、数组和字符串的高效写入。

private static void charWriter() {
	File file = new File("F:/test.txt");
	try {
		Writer writer = new FileWriter(file, true);
		BufferedWriter bw = new BufferedWriter(writer);

		bw.write("我爱Java SE");
		bw.flush();
		bw.close();
	} catch (FileNotFoundException e) {
		e.printStackTrace();
	} catch (IOException e) {
		e.printStackTrace();
	}
}// charWriter

private static void charReader() {
	File file = new File("F:/test.txt");
	try {
		Reader reader = new FileReader(file);
		// 为字符流提供缓存,达到高效读取的目的
		BufferedReader br = new BufferedReader(reader);
		char[] buf = new char[1024];
		int len = -1;
		while ((len = br.read(buf)) != -1) {
			System.out.println(new String(buf, 0, len));
		}
		br.close();// 不用关闭reader,是因为关闭br时内部已经帮我们关闭了reader
	} catch (FileNotFoundException e) {
		e.printStackTrace();
	} catch (IOException e) {
		e.printStackTrace();
	}
}// charReader

为什么要用字符缓冲流

  • 字符缓冲流: 加入字符缓冲流,增强读取功能,新增方法readLine() 更高效的读取
  • FileReader:内部使用InputStreamReader,解码过程,byte->char,默认缓存大小是8k
  • BufferedReader:默认缓存大小是8k,但是可以手动指定大小,把数据直接读取到缓存中,减少转换过程的次数,效率更高。所以虽然FileReader中已经加入了缓存,仍要加上BufferedReader的原因
原文地址:https://www.cnblogs.com/zxfei/p/10873898.html