android自願目錄assets與res/raw的不同

android資源目錄—assets與res/raw的不同

assets:用於存放需要打包到應用程序的靜態文件,以便部署到設備中。與res/raw不同點在於,ASSETS支持任意深度的子目錄。這些文件不會生成任何資源ID,必須使用/assets開始(不包含它)的相對路徑名。

 

res:用於存放應用程序的資源,將被打包到編譯後的Java中。不支持深度子目錄

 

res/menu:存放基於XML的菜單描述;

 

res/raw:存放通用的文件, 該文件夾內的文件將不會被編譯成二進制文件,按原樣復制到設備上。

 

res/values:存放字符串、尺寸值。

 

res/xml: 存放通用的XML文件

三個特殊的資源目錄 /res/xml /res/raw 和 /assets

在android開發中,我們離不開資源文件的使用,從drawable到string,再到layout,這些資源都為我們的開發提供瞭極大的便利,不過我們平時大部分時間接觸的資源目錄一般都是下面這三個。

/res/drawable

/res/values

/res/layout

但android的資源文件並不止這些,下面就為大傢介紹一下另外三個資源目錄

/res/xml

/res/raw

/assets

首先是/res/xml ,這個目錄中大傢可能偶爾用到過,這裡可以用來存儲xml格式的文件,並且和其他資源文件一樣,這裡的資源是會被編譯成二進制格式放到最終的安裝包裡的, 我們也可以通過R類來訪問這裡的文件,並且解析裡面的內容,例如我們在這裡存放瞭一個名為data.xml的文件:

<?xml version="1.0" encoding="utf-8"?>

<root>

<title>Hello XML!</title>

</root>

隨後,我們就可以通過資源ID來訪問並解析這個文件瞭

XmlResourceParser xml = getResources().getXml(R.xml.data);

xml.next();

int eventType = xml.getEventType();

boolean inTitle = false;

while(eventType != XmlPullParser.END_DOCUMENT) {

//到達title節點時標記一下

if(eventType == XmlPullParser.START_TAG) {

if(xml.getName().equals("title")) {

inTitle = true;

}

}

//如過到達標記的節點則取出內容

if(eventType == XmlPullParser.TEXT && inTitle) {

((TextView)findViewById(R.id.txXml)).setText(

xml.getText()

);

}

xml.next();

eventType = xml.getEventType();

}

在這裡,我們用資源類的getXml方法,返回瞭一個xml解析器,這個解析器的工作原理和SAX方式差不多, 要註意的是,這裡的xml文件,最終是會被編譯成二進制形式的,如果大傢想讓文件原樣存儲的話,那麼就要用到下一個目錄啦,那就是/res/raw目錄

這個目錄的唯一區別就是,這裡的文件會原封不動的存儲到設備上,不會被編譯為二進制形式,訪問的方式也是通過R類,下面是一個例子:

((TextView)findViewById(R.id.txRaw)).setText(

readStream(getResources().openRawResource(R.raw.rawtext))

);

private String readStream(InputStream is) {

try {

ByteArrayOutputStream bo = new ByteArrayOutputStream();

int i = is.read();

while(i != -1) {

bo.write(i);

i = is.read();

}

return bo.toString();

} catch (IOException e) {

return "";

}

}

這次使用資源類中的方法,openRawResource,返回給我們一個輸入流,這樣我們就可以任意讀取文件中的內容瞭,例如上面例子中那樣,原樣輸出文本文件中的內容。

當然,如果你需要更高的自由度,盡量不受android平臺的約束,那麼/assets這個目錄就是你的首選瞭~

這個目錄中的文件除瞭不會被編譯成二進制形式之外,另外一點就是,訪問方式是通過文件名,而不是資源ID。並且還有更重要的一點就是,大傢可以在這 裡任意的建立子目錄,而/res目錄中的資源文件是不能自行建立子目錄的。如果需要這種靈活的資源存儲方式,那麼就看看下面這個例子:

AssetManager assets = getAssets();

((TextView)findViewById(R.id.txAssets)).setText(

readStream(assets.open("data.txt"))

);

在context上下文中,調用getAssets返回一個AssetManager,然後使用open方法就可以訪問需要的資源瞭,這裡open方法是以assets目錄為根的。所以上面這段代碼訪問的是assets目錄中名為data.txt的資源文件~

一、 Assets介紹

Android除瞭提供/res目錄存放資源文件外,在/assets目錄也可以存放資源文件,而 且/assets目錄下的資源文件不會在R.java自動生成ID,所以讀取/assets目錄下的文件必須指定文件的路徑。我們可以通過AssetManager類來訪問這些文件。

二、 Assets使用

主要使用類AssetManager和類assets

AssetManager主要由上下文Context或者ActivetyThead得到getAssets()————->AssetManager有接 口open()會連接assets_path + “assets” + filename來打開文件,同時把APK文件當作ZIP文件進行解壓讀取。

Java代碼:

private Bitmap getImageFromAssetFile(String fileName){

Bitmap image = null;

try{

AssetManager am = context.getAssets();

InputStream is = am.open(fileName);

image = BitmapFactory.decodeStream(is);

is.close();

}catch(Exception e){

}

return image;

}

三、 大小限制

UNCOMPRESS_DATA_MAX定義限制文件大小不能大於1M,解決辦法可以把文件放到SDCARD或者使用SQLITE數據庫。還有使用Activity提供openFileOutput和openFileInput方法等。

四、 Assets類

AssetManager文件後會到得一個Assets的指針,同時AssetManager也能得到下面全部文件的列表等。

Assets主要接口:

virtual int openFileDescriptor(off_t* outStart, off_t* outLength) const = 0;

virtual ssize_t read(void* buf, size_t count) = 0;

virtual const void* getBuffer(bool wordAligned) = 0;

摘自 哈全文

發佈留言

發佈留言必須填寫的電子郵件地址不會公開。