BufferedInputStream原始碼分析

2021-07-04 00:00:21 字數 1261 閱讀 5414

參考文章:

首先,bufferedinputstream能夠加快讀取速度的原因,是因為,每次它都將buffer.length的資料從資料來源讀取到記憶體中,呼叫read()方法或者read(int[ ] buf , int off , int len)都是從記憶體中的buffer中直接讀取的,這要比從資料來源(比如硬碟)裡每次讀取一點要快很多。而基本類fileinputstream裡的read()方法或者read(int[ ] buf , int off , int len)方法,是從硬碟裡一點點讀的。

那麼,對於這個類來說,最重要的就是如何填充緩衝了,分為以下四種情況:(要填充緩衝的大前提是緩衝中的資料已被讀取完,即pos >= count,在這個類中,pos代表緩衝區中下乙個要被讀取的資料的下標,count代表緩衝區中有效資料的總長度,buffer.length是緩衝區的實際大小。)

無標記——從輸入流中讀入資料從buffer的0號下標開始填充buffer.length長度的資料

有標記,但是markpos > 0——保留從markpos到pos之間的資料,然後從輸入流中讀入資料從buffer的pos號下標開始填充buffer.length長度的資料

有標記,markpos = 0,且緩衝區無剩餘,且buffer.length > marklimit——此處和情況二的區別是,如果仍按情況二里的方法保留從markpos到pos之間的資料,因為markpos=0,那麼還是保留了全部資料,緩衝區無剩餘的情況並沒有解決。所以,此時根據buffer.length和marklimit的大小關係來決定,是廢除標記的部分還是擴容。如果大於marklimit,則廢除標記,重新填入資料

有標記,markpos = 0,且緩衝區無剩餘,且buffer.length < marklimit——如果小於marklimit,則擴容

private void fill() throws ioexception  else if (buffer.length >= marklimit)  else if (buffer.length >= max_buffer_size)  else 

buffer = nbuf;

}count = pos;

//從輸入流中讀取buffer.length - pos長度的資料到buffer中

int n = getinifopen().read(buffer, pos, buffer.length - pos);

if (n > 0)

count = n + pos;//更新count的長度

}

Cartographer原始碼篇 原始碼分析 1

在安裝編譯cartographer 1.0.0的時候,我們可以看到 主要包括cartorgarpher ros cartographer ceres sover三個部分。其中,ceres solver用於非線性優化,求解最小二乘問題 cartographer ros為ros平台的封裝,獲取感測器資料...

AbstractListView原始碼分析3

normal list that does not indicate choices public static final int choice mode none 0 the list allows up to one choice public static final int choice ...

Android AsyncTask原始碼分析

android中只能在主線程中進行ui操作,如果是其它子執行緒,需要借助非同步訊息處理機制handler。除此之外,還有個非常方便的asynctask類,這個類內部封裝了handler和執行緒池。本文先簡要介紹asynctask的用法,然後分析具體實現。asynctask是乙個抽象類,我們需要建立子...