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