日本免费高清视频-国产福利视频导航-黄色在线播放国产-天天操天天操天天操天天操|www.shdianci.com

學(xué)無先后,達者為師

網(wǎng)站首頁 編程語言 正文

FileInputStream與BufferedInputStream的區(qū)別

作者:CHAN YEOL? 更新時間: 2022-07-13 編程語言

Java標(biāo)準庫的java.io.InputStream定義了所有輸入流的超類:

FileInputStream實現(xiàn)了文件流輸入;

BufferedInputStream使用緩沖區(qū)提高文件的讀取效率;

ByteArrayInputStream在內(nèi)存中模擬一個字節(jié)流輸入;

一. FileInputStream(文件輸入流)

FileInputStream是InputStream的子類,是從文件流中讀取數(shù)據(jù),每次讀取都是從硬盤中讀取,讀取速度較慢;

InputStream中通過 read()方法讀取輸入流的下一字節(jié),并返回字節(jié)表示的 int 值(0 ~ 255),如果讀到-1就不能繼續(xù)讀取;

InputStream緩沖讀取:先定義一個byte[]數(shù)組作為緩沖區(qū),read()方法會盡可能多的讀取字節(jié)到緩沖區(qū),但不會超過緩沖區(qū)的大小。

利用緩沖區(qū)一次讀取InputStream的所有字節(jié)(兩種方法):

(1)? 逐個字節(jié)讀取;(2)批量讀取。

代碼實現(xiàn)如下:

try (InputStream in = new FileInputStream("D:\\countNumber.text")) {
             // 方式1:逐個字節(jié)讀取
//		int data = -1;
//		while((data = in.read()) != -1) {
//			System.out.println((char)data);
//		}
			// 方式2:批量讀取
			byte[] buff = new byte[1000]; // 定義1000個字節(jié)大小的緩沖區(qū)
			int size = -1;
			while((size = in.read(buff)) != -1) {
				System.out.println();
			}
		} catch (IOException e1) {
			e1.printStackTrace();
		}
		
		

二 . BufferedInputStream(緩沖輸入流)

BufferedInputStream是緩沖輸入流(帶有緩沖區(qū)的字節(jié)輸入流),繼承于FilterInputStream(是InputStream的子類),作用是為另一個輸入流添加一些功能:提供緩沖功能以及支持“mark() 標(biāo)記”,“reset()重置方法";

BufferedInputStream本質(zhì)是通過一個內(nèi)部緩沖區(qū)數(shù)組實現(xiàn)的,它有一個默認大小為8192的緩沖區(qū)(讀取速度較快)。例如,在新建某輸入流對應(yīng)的BufferedInputStream后,當(dāng)我們通過read()讀取輸入流的數(shù)據(jù)時,BufferedInputStream會將該輸入流的數(shù)據(jù)分批的填充到緩沖區(qū)中。每當(dāng)緩沖區(qū)的數(shù)據(jù)被讀完之后,輸入流會再次填充數(shù)據(jù)緩沖區(qū);如此反復(fù),直到我們讀完輸入流數(shù)據(jù)位置。

public class BufferedInputStream extends FilterInputStream {

    private static int DEFAULT_BUFFER_SIZE = 8192;
    ...}
			try (BufferedInputStream bis = new BufferedInputStream(new FileInputStream("D:\\countNumber.text"))) {
			// 方式1:逐個字節(jié)讀取
			// int data = -1;
			//while((data = bis.read()) != -1) {
		//		System.out.println(data);
		//	}
			// 方式2:批量讀取
			byte[] buffData = new byte[128]; // 用來存儲每次讀取到的字節(jié)數(shù)組

			int len = -1; // 每次讀取到的字節(jié)數(shù)組的長度
			while((len = bis.read(buffData)) != -1) {
				System.out.println(Arrays.toString(buffData));
			}
		} catch (IOException e) {
			e.printStackTrace();
		} 

?注:如果打開了一個文件進行讀寫,完成后要及時關(guān)閉,以便讓os釋放資源 (try語句:快捷鍵:shift+alt+z,編譯器會自動寫入finally并調(diào)用close()),實際上,編譯器并不會特別的為InputStream加上自動關(guān)閉,而是因為其實現(xiàn)了AutoCloseable接口,由于實現(xiàn)了此接口,才會自動寫入finally并調(diào)用close();

原文鏈接:https://blog.csdn.net/weixin_45939128/article/details/124851050

欄目分類
最近更新