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的原因


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM