參考文章:
首先,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是乙個抽象類,我們需要建立子...