1. 程式人生 > >Android資料儲存之File

Android資料儲存之File

檔案儲存分為兩種:
(1)內部儲存:  存放路徑為/data/data/package_name/files/
(2)外部儲存:  SD卡
(3)擴充對資源xml檔案的操作


一、內部儲存
1.兩個函式
openFileOutput  寫入  許可權:MODE_PRIVATE,  MODE_APPEND, MODE_WORLD_READABLE, MODE_WORLD_WRITEABLE
openFileInput   讀取



2.寫檔案
FileOutputStream fos = openFileOutput(FILENAME, FILE_ACCESS);
String sContent = "12 34 56 789";
//getBytes Returns a new byte array containing the characters of this string encoded using the system's default charset.
fos.write(sContent.getBytes()); 
fos.flush(); //小量資料時系統存在記憶體中,可多次write後再調一次flush重新整理到flash
fos.close();


3.讀檔案
FileInputStream fis = openFileInput(FILENAME);
byte[] buffer = new byte[fis.available()];  //該介面不保證等於檔案的實際長度
while (fis.read(buffer) != -1){
}
String str = new String(buffer);
fis.close();


注意:以上讀寫檔案操作都是not save的,需要進行try/catch


二、SD卡儲存
和檔案儲存類似,操作sdcard檔案前提是
(1)要確認sdcard已掛載。
(2)以絕對路徑方式建立檔案
(3)檢測sdcard檔案存在及可讀寫性
在已掛在的外部USB裝置上進行讀寫,sdcard具有可讀寫許可權.
eg:
public String SDCARD_PATH = "/mnt/vold/usbdisk1/sda1";
public void createFileInSdcard(String _filename) {
String sTestContent = "testx.txt";
FileOutputStream fos = null;
File dir = null;
File sdcardFile = null;

dir = new File(SDCARD_PATH);
if (dir.exists() && dir.canWrite()) {
sdcardFile = new File(dir.getAbsolutePath() + "/" + _filename);
try {
sdcardFile.createNewFile();
if (sdcardFile.exists() && sdcardFile.canWrite()) {
fos = new FileOutputStream(sdcardFile);
//fos =openFileOutput(sdcardFile, Context.MODE_WORLD_WRITEABLE + Context.MODE_WORLD_READABLE);
fos.write(sTestContent.getBytes());
}
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} finally {
if (fos != null) {
try {
fos.flush();
fos.close();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
}
}


【注】上面File.createNewFile方法建立的檔案預設屬性為rwx-rwx-rwx, 如果不想ugo都具有rwx許可權,在檢測sdcard存在後建立檔案的操作
      可以參照檔案內部儲存的方式建立。


在AVD上模擬SDcard方法

(1)通過android-sdk的tools下的mksdcard工具對映成本地的檔案(模擬sdcard)
   mksdcard -l sdcard 128M E:\android_proj\AVDSDcard
   -l sdcard   定義sdcard的標籤
   128M        定義sdcard的容量
   E:\android_proj\AVDSDcard 是本地的路徑(檔案)
(2)在執行配置裡新增屬性
 


(3)要在AVD裡指定sdcard檔案的路徑
   eclipse -> windows->Android Virtual Device Manager
    



(4)啟動AVD,往sdcard裡上傳一個檔案,如果能成功,則sdcard建立成功
 


(5)以上通過adb 可以往sdcard裡上傳檔案,但是通過程式往裡面寫的時候會包no permission,需要在AndroidMainifest.xml里加上寫許可權
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />


三、資原始檔
程式開發常用的資原始檔分兩種:
原始資原始檔:如音視訊檔案等   --->/res/raw 目錄下
XML檔案:                    --->/res/xml 目錄下
1.解析raw檔案
(1)獲取資源物件Resources
(2)開啟資原始檔
(3)讀取資源inputstream流,然後按自己的要求執行
(4)關閉資原始檔
private void catResRawFile(int nResId){
InputStream sInStream = null;
Resources res = this.getResources();
byte[] bReadBuf = null;

sInStream = res.openRawResource(nResId);
try {
bReadBuf = new byte[sInStream.available()];
while (sInStream.read(bReadBuf) != -1) {
}
txtVContent.setText(new String(bReadBuf/*, "utf-8"*/));
} catch (IOException e) {
// TODO Auto-generated catch block
Log.e(TAG, e.getMessage(), e); 
e.printStackTrace();
} finally {
if (sInStream != null) {
try {
sInStream.close();
} catch (IOException e) {
// TODO Auto-generated catch block
Log.e(TAG, e.getMessage(), e); 
e.printStackTrace();
}
}
}
}


2.解析XML檔案
例:
<people> 
<person name="李某某" age="21" height="1.81" /> 
<person name="王某某" age="25" height="1.76" /> 
<person name="張某某" age="20" height="1.69" /> 
</people>
(1)獲取資源物件Resources
(2)獲取xml資源的xml解析器XmlPullParser  (Android平臺標準的解析器)
(3)逐個節點解析
解法(一):
public void catResXmlFile(int nXmlId){
String sPeople = "";
String sName = "";
String sAge = "";
String sHeight = "";
String sContent = "";
String sAttrName = "";
String sAttrValue = "";
int nAttrNum = 0;

XmlPullParser xmlparser = this.getResources().getXml(nXmlId);
try {
while (xmlparser.next() != XmlPullParser.END_DOCUMENT) {
sPeople = xmlparser.getName();
if (sPeople != null && sPeople.equals("person")) {
nAttrNum = xmlparser.getAttributeCount();
for (int i = 0; i < nAttrNum; i++) {
sAttrName = xmlparser.getAttributeName(i);
sAttrValue = xmlparser.getAttributeValue(i);
if (sAttrName != null && sAttrName.equals("name")) {
sName = sAttrValue;
} else if (sAttrName != null && sAttrName.equals("age")) {
sAge = sAttrValue;
} else if (sAttrName != null && sAttrName.equals("height")) {
sHeight = sAttrValue;
}
}

if (sName != null && sAge != null && sHeight != null) {
sContent += "\t(" + sName + ", " + sAge + ", " + sHeight +")\n";
Log.d(TAG, sContent);
Log.d(TAG, "=====================");
}
xmlparser.next();
}
}
} catch (XmlPullParserException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}

txtVContent.setText(sContent);
}


解法(二):
@SuppressLint("NewApi")
private void catResXmlFile2(int nXmlId) {
String sPeople = "";
String sName = "";
String sAge = "";
String sHeight = "";
String sContent = "";
String sAttrName = "";
String sAttrValue = "";
int nAttrNum = 0;
int nCnt = 0;

XmlPullParser xmlparser = this.getResources().getXml(nXmlId);
int nEvtType = 0;
try {
nEvtType = xmlparser.getEventType();
while (nEvtType != XmlPullParser.END_DOCUMENT) {
switch (nEvtType) {
case XmlPullParser.START_DOCUMENT:
break;
case XmlPullParser.START_TAG:
sPeople = xmlparser.getName();
if (!sPeople.isEmpty() && sPeople.equals("person")) {
nAttrNum = xmlparser.getAttributeCount();
for (nCnt = 0; nCnt < nAttrNum; nCnt++) {
sAttrName = xmlparser.getAttributeName(nCnt);
sAttrValue = xmlparser.getAttributeValue(nCnt);
if (sAttrName != null && sAttrName.equals("name")) {
sName = sAttrValue;
} else if (sAttrName != null && sAttrName.equals("age")) {
sAge = sAttrValue;
} else if (sAttrName != null && sAttrName.equals("height")) {
sHeight = sAttrValue;
}
}
if (sName != null && sAge != null && sHeight != null) {
sContent += "\t(" + sName + ", " + sAge + ", " + sHeight +")\n";
Log.d(TAG, sContent);
Log.d(TAG, "=====================");
}
xmlparser.next();
}
break;
case XmlPullParser.END_TAG:
break;
case XmlPullParser.END_DOCUMENT:
break;
default:
break;
}
}
} catch (XmlPullParserException e) {
Log.d(TAG, "xmlparser error !");
// TODO Auto-generated catch block
e.printStackTrace();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} finally {
txtVContent.setText(sContent);
}
}


以上只是解析最簡單的xml格式。

相關推薦

Android 資料儲存File

public class MainActivity extends AppCompatActivity { @Override protected void onCreate(Bundle savedInstanceState) { sup

Android資料儲存File

檔案儲存分為兩種: (1)內部儲存:  存放路徑為/data/data/package_name/files/ (2)外部儲存:  SD卡 (3)擴充對資源xml檔案的操作 一、內部儲存 1.兩個函式openFileOutput  寫入  許可權:MODE_PRIVATE,

Android 資料儲存 SQLite資料庫儲存

轉載自:https://www.cnblogs.com/woider/p/5136734.html ----------------------------------------SQLite資料庫---------------------------------------------- SQLite是一

Android資料儲存SQLite簡單用法

實現效果圖如下: activity_main.xml佈局檔案 <?xml version="1.0" encoding="utf-8"?> <LinearLayout xmlns:android="http://schemas.android.com/a

Android資料儲存SharedPreferences詳細總結

Android中常見的幾種儲存方式: SharedPreferences SQLite資料庫儲存 檔案儲存 網路儲存 其中也許最常用的就是SharedPreferences儲存和檔案儲存了,今天總結一下SharedPreferences。帶著問題學習Sh

Android資料儲存SharedPreferences及如何安全儲存

前言:     最近一直在學習Android的資料儲存,當學習到SharedPreferences的時候讓我回想起了ios的NSUserDefaults,其實這兩個真是異曲同工的,實現方式都是通過xml儲存的,在ios裡叫plist檔案,裡面都是xml。 什麼是SharedPreferences儲存?  

Android資料儲存資料庫

SQLite資料庫儲存 SQLite 是一款輕量級的關係型資料庫, 它的運算速度非常快,佔用資源很少, 通常只需要幾百 K 的記憶體就足夠了, 因而特別適合在移動裝置上使用。 SQLite不僅支援標準的 SQL 語法,還遵循了資料庫的 ACID 事務,所以只要

Android資料儲存Sqlite採用SQLCipher資料庫加密實戰

前言:   最近研究了Android Sqlite資料庫(文章地址:http://www.cnblogs.com/whoislcj/p/5506294.html)以及ContentProvider程式間資料共享(http://www.cnblogs.com/whoislcj/p/5507928.html),

android 資料儲存&lt;一&gt;----android簡訊傳送器檔案的讀寫(手機+SD卡)

本文實踐知識點有有三: 1.佈局檔案,android佈局有相對佈局。線性佈局,絕對佈局。表格佈局。標籤佈局等,各個佈局能夠巢狀的。 本文的佈局檔案就是線性佈局的巢狀 <LinearLayout xmlns:android="http://schemas.and

Android專案資料儲存SharedPreferences

SharedPreference的本質是基於XML檔案儲存的key-value鍵值對資料,儲存的檔案路徑為/data/data/<包名>/shared_prefs目錄下。 注意:Share

Android資料儲存(二)File 資料內部儲存

Java提供了一套完整的IO流體系,用來對檔案進行操作。Android同樣支援以這種方式來訪問手機儲存器上的檔案,包括內部儲存器和外部儲存器 Android中可以在裝置本身的儲存裝置或者外接的儲存裝置中建立用於儲存資料的檔案。預設情況下,檔案是不能在不同的程式間共享的。當

Android 資料儲存---File內部儲存

Java提供了一套完整的IO流體系,包括FileInputStream、FileOutputStream等,通過這些IO流可以非常方便的訪問磁碟上的內容。Android同樣支援以這種方式來訪問手機儲存器上的檔案。 Context提供瞭如下兩種方法來開啟應用程式

Android==》資料儲存==》File(檔案)儲存

public class MainActivity extends Activity {private EditText inputEditText;private Button btn;private TextView showView;@Overrideprotecte

Android資料儲存五種方式

https://www.cnblogs.com/ITtangtang/p/3920916.html SharedPreferences的基本使用-----存,刪,改,查:https://www.cnblogs.com/qianzf/p/7582400.html Android Sha

Android 本地儲存外部儲存/內部儲存路徑獲取大全

//:/system String rootDir = Environment.getRootDirectory().toString(); System.out.println("Environment.getRootDirectory()=:" +

原創 | 入門資料分析--資料儲存常用資料庫及區別

獲取資料,除了通過外部獲得,內部獲取,也是一個主要獲取資料的方式。內部資料主要是通過資料庫儲存的方式,將資料存下來,便於各個需求方再去提取應用。那麼,企業常用的儲存資料的資料庫都有哪些呢?不同的資料庫的儲存區別又有哪些? 目前市場上的資料庫主要可以分為關係型資料庫和非關係型資料庫,關係型資料庫通過外來鍵關聯

資料儲存使用MongoDB資料庫儲存資料

安裝MongoDB環境: 1.官網下載:https://www.mongodb.com/download-center#community 2.MongoDB視覺化工具compass下載https://www.mongodb.com/download-center#compass 筆記

Android資料儲存的方式

1.Android常用的資料儲存方式 File儲存 SharedPreferences儲存 SQLite輕量型資料庫 ContentProvider 四大元件之一 2.File儲存 最基本的一種資料儲存方式,不對儲存的內容進行任何的格式化處理,所有

Android資料儲存方案

android內建資料庫——SQLLite 概述SQLite SQLite是一款輕型的資料庫,是遵守ACID的關聯式資料庫管理系統,它的設計目標是嵌入  式的,而且目前已經在很多嵌入式產品中使用了它,它佔用資源非常的低,在嵌入式裝置中,可能只需要幾百K的記憶體就夠了。它能

那些年,我爬過的北科(五)——資料儲存使用MongoDB

介紹 在前面我們介紹瞭如何編寫爬蟲,但是我們的爬蟲並沒有把資料儲存下來,只是簡單的顯示在控制檯中。在本節,我們將簡單學習一下資料庫,以及如何在python中操作資料庫。 最後,我們將修改上一節的爬蟲框架,使其支援資料庫插入。 注:如果讀者已經瞭解mongodb,可以直接跳到最後一個部分:修改我們的爬蟲框