Android開發之資源文件存儲

在Android開發中關於資源文件的存儲操作。

 

 

在android開發中,資源文件是我們使用頻率最高的,無論是string,drawable,還是layout,這些資源都是我們經常使用到的,而且為我們的開始提供很多方便,不過我們平時接觸的資源目錄一般都是下面這三個。

 

/res/drawable 

/res/values 

/res/layout

 

 

除些之外,Android資源文件還有以下三種會經常使用到:

 

/res/xml  

 

/res/raw

 

/assets

 

 

 

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

 

 

 

例如我們在這裡存放瞭一個名為file.xml的文件:

 

 

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

<book>

<title>XML高級編程</< span>title>

</< span>book>  

 

 

  隨後,我們就可以通過資源ID來訪問並解析這個文件瞭,如下代碼所示:

 

 

 

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

    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的資源文件。

 

 

 

Android文件資源(raw/data/asset)的存取代碼如下: 

 

一、私有文件夾下的文件存取(/data/data/包名)

 

  

 

    import java.io.FileInputStream;   

    import java.io.FileOutputStream;  

    import org.apache.http.util.EncodingUtils;  

      

    public void writeFileData(String fileName,String message){  

        try{  

         FileOutputStream fout = openFileOutput(fileName, MODE_PRIVATE);  

         byte [] bytes = message.getBytes();  

         fout.write(bytes);  

          fout.close();  

         }  

        catch(Exception e){  

         e.printStackTrace();  

        }  

    }     

      

      

    public String readFileData(String fileName){  

         String res="";  

         try{  

          FileInputStream fin = openFileInput(fileName);  

          int length = fin.available();  

          byte [] buffer = new byte[length];  

          fin.read(buffer);      

          res = EncodingUtils.getString(buffer, "UTF-8");  

          fin.close();      

         }  

         catch(Exception e){  

          e.printStackTrace();  

         }  

         return res;  

        }    

 

 

二、從resource中的raw文件夾中獲取文件並讀取數據(資源文件隻能讀不能寫)

  

 

    public String getFromRaw(String fileName){   

       String res = "";  

       try{  

        InputStream in = getResources().openRawResource(R.raw.test1);   

        int length = in.available();        

        byte [] buffer = new byte[length];         

        in.read(buffer);          

        res = EncodingUtils.getString(buffer, "UTF-8");     

        in.close();             

       }  

       catch(Exception e){  

        e.printStackTrace();          

       }  

    return res ;  

   }  

 

 

三、從asset中獲取文件並讀取數據(資源文件隻能讀不能寫) 

 

 

 

 public String getFromAsset(String fileName){   

    String res="";  

    try{  

     InputStream in = getResources().getAssets().open(fileName);    

     int length = in.available();          

        byte [] buffer = new byte[length];         

        in.read(buffer);             

        res = EncodingUtils.getString(buffer, "UTF-8");      

    }  

    catch(Exception e){  

     e.printStackTrace();          

    }  

    return res;  

}

 

 

關於Android獲取assets的絕對路徑有如下方法:

 

第一種方法:  

 

String path = "file:///android_asset/文件名";

 

第二種方法:

 

InputStream abpath = getClass().getResourceAsStream("/assets/文件名");

 

 

 

若要想要轉換成String類型,則使用下列代碼:

 

 

      String path = new String(InputStreamToByte(abpath ));

 

    private byte[] InputStreamToByte(InputStream is) throws IOException {

        ByteArrayOutputStream bytestream = new ByteArrayOutputStream();

        int ch;

 

        while ((ch = is.read()) != -1) {

            bytestream.write(ch);

        }

 

        byte imgdata[] = bytestream.toByteArray();

        bytestream.close();

        return imgdata;

    }

  

 

 

發佈留言

發佈留言必須填寫的電子郵件地址不會公開。 必填欄位標示為 *