For investors
股價(jià):
5.36 美元 %For investors
股價(jià):
5.36 美元 %認(rèn)真做教育 專心促就業(yè)
Android處理底層I/O性能不是很理想,如果不想使用NDK則可以通過(guò)MemoryFile類實(shí)現(xiàn)高性能的文件讀寫操作。 MemoryFile顧名思義就是內(nèi)存文件的意思,如果你過(guò)去從事過(guò)Win32開發(fā),那么它的原理就是MapViewOfFile(),當(dāng)然開發(fā)過(guò) Linux的網(wǎng)友可能很快就聯(lián)想到了mmap(),是的該類就是他們的托管代碼層封裝,位于android.os.MemoryFile這個(gè)位置,從 Android 1.0開始就被支持。
MemoryFile適用于哪些地方呢?
對(duì)于I/O需要頻繁操作的,主要是和外部存儲(chǔ)相關(guān)的I/O操作,MemoryFile通過(guò)將 NAND或SD卡上的文件,分段映射到內(nèi)存中進(jìn)行修改處理,這樣就用高速的RAM代替了ROM或SD卡,性能自然提高不少,對(duì)于Android手機(jī)而言同 時(shí)還減少了電量消耗。Android123提示網(wǎng)友該類實(shí)現(xiàn)的功能不是很多,直接從Object上繼承,通過(guò)JNI的方式直接在C底層執(zhí)行。
主要的構(gòu)造方法 MemoryFile(String name, int length) ,這里第二個(gè)參數(shù)為文件大小,需要說(shuō)明的是Android的MemoryFile和傳統(tǒng)的mmap還有一點(diǎn)點(diǎn)區(qū)別,畢竟是手機(jī),它內(nèi)部的內(nèi)存管理方式 ashmem會(huì)從內(nèi)核中回收資源。畢竟目前部分低端機(jī)型的RAM也比較吃緊。
synchronized boolean allowPurging(boolean allowPurging) //允許ashmem清理內(nèi)存,線程安全同步的方式。
void close() //關(guān)閉,因?yàn)樵贚inux內(nèi)部mmap占用一個(gè)句柄,不用時(shí)一定要釋放了
InputStream getInputStream() 返回讀取的內(nèi)容用Java層的InputStream保存
OutputStream getOutputStream() 把一個(gè)OutputSream寫入到MemoryFile中
boolean isPurgingAllowed() //判斷是否允許清理
int length() //返回內(nèi)存映射文件大小
下面就是我們熟悉的,讀寫細(xì)節(jié),主要是對(duì)字符數(shù)組的操作,這里大家要計(jì)算好每個(gè)文件類型的占用,同時(shí)考慮到效率對(duì)于自己分配的大小考慮粒度對(duì)齊。
int readBytes(byte[] buffer, int srcOffset, int destOffset, int count)
void writeBytes(byte[] buffer, int srcOffset, int destOffset, int count)
具體的實(shí)際應(yīng)用,Android開發(fā)網(wǎng)將在下次和大家講到。
【免責(zé)聲明】本文部分系轉(zhuǎn)載,轉(zhuǎn)載目的在于傳遞更多信息,并不代表本網(wǎng)贊同其觀點(diǎn)和對(duì)其真實(shí)性負(fù)責(zé)。如涉及作品內(nèi)容、版權(quán)和其它問(wèn)題,請(qǐng)?jiān)?0日內(nèi)與聯(lián)系我們,我們會(huì)予以更改或刪除相關(guān)文章,以保證您的權(quán)益!