在Android中,數據的存儲分爲兩種方式:數據庫
一、直接以文件的形式存儲在目錄中json
二、以json格式存儲在數據庫中app
將數據以文件的存儲又分爲兩種方式:ide
一、生成.txt文件工具
二、生成xml文件學習
那麼今天就來詳細的說一下以文件的形式存儲,因爲沒有講到數據庫,在以後的課程中會講到json格式存儲在數據庫中。測試
文件的生成無非就是咱們Java中學習的輸入輸出流中的一部分,有Java基礎相信都是很容易理解的,由於它真的很簡單啦~~優化
一、生成目錄能夠分爲兩種:this
1)本機spa
2)SD卡
二、生成.txt文件的方式又能夠分爲4種
1)使用MODE_PRIVATE模式,生成一個私有的文件
2)使用MODE_PRIVATE模式,生成一個appent文件
3)使用MODE_WORLD_READABLE模式,生成一個readable文件
4)使用MODE_WORLD_WRITEABLE模式,生成一個writeable文件
在生.txt文件以前,咱們有必要先了解一下文件的權限,以下圖:
一、第一格:表示文件的類型
二、第2-4格:表示當前用戶擁有的權限
三、第5-7格:表示當前用戶所在組擁有的權限
四、第8-10格:表示其餘用戶擁有的權限
五、"r":表示可讀;"w":表示可寫;"x":表示可執行;"-":表示什麼權限也沒有,若是看到"rwx"就表示可讀可寫可執行,其餘組合亦是如此
注意:不一樣的模式生成的文件的權限是不同的,以及生成文件的類型的權限也是不同的。
那麼下面就詳細的來講一下這幾種方式
一、如圖所示,當咱們點擊button按鈕時觸發文件的監聽,這裏的按鈕就是簡單的按鈕,可是要記得設置onclick點擊事件的屬性哦~你們都不傻是吧…………
1)使用MODE_PRIVATE模式,生成一個私有的文件
//點擊按鈕1,使用MODE_PRIVATE模式,生成一個私有的文件 public void click1(View v){ try { FileOutputStream fos = openFileOutput("private.txt", MODE_PRIVATE); fos.write("private".getBytes()); fos.close(); } catch (Exception e) { e.printStackTrace(); } }
2)使用MODE_PRIVATE模式,生成一個appent文件
//點擊按鈕2,使用MODE_PRIVATE模式,生成一個appent文件 public void click2(View v){ try { FileOutputStream fos = openFileOutput("appent.txt", MODE_PRIVATE); fos.write("appent".getBytes()); fos.close(); } catch (Exception e) { e.printStackTrace(); } }
3)使用MODE_WORLD_READABLE模式,生成一個readable文件
//點擊按鈕3,使用MODE_WORLD_READABLE模式,生成一個readable文件 public void click3(View v){ try { FileOutputStream fos = openFileOutput("readable.txt", MODE_WORLD_READABLE); fos.write("readable".getBytes()); fos.close(); } catch (Exception e) { e.printStackTrace(); } }
4)使用MODE_WORLD_WRITEABLE模式,生成一個writeable文件
//點擊按鈕4,使用MODE_WORLD_WRITEABLE模式,生成一個write文件 public void click4(View v){ try { FileOutputStream fos = openFileOutput("writeable.txt", MODE_WORLD_WRITEABLE); fos.write("writeable".getBytes()); fos.close(); } catch (Exception e) { e.printStackTrace(); } }
部分代碼說明
FileOutputStream: 文件輸出流
openFileOutput("private.txt", MODE_PRIVATE):openFileOutput是Android中封裝好的文件輸出流,private.txt就是生成的文件名,MODE_PRIVATE這個就是上面說到的模式啦!
fos.write("private".getBytes()):write就是寫入什麼內容,這裏的參數就是你要寫入的文本內容,getBytes()………………^_^不知道本身去看Java基礎吧哈哈哈~~~
close():關閉流對象
try-catch:有異常,try一下……
MODE_WORLD_WRITEABLE,MODE_WORLD_READABLE:這兩個模式已經被廢棄了……沒有那麼多爲何!哈哈哈……
感受本身萌萌噠……實在不會的就複習Java基礎吧!
那麼這裏就生成了以下圖所示的4個文件
二、將文件存儲在SD卡
一、獲取SD卡的路徑:
String sdPath = Environment.getExternalStorageDirectory().getPath() ;
二、添加路徑
File file = new File(sdPath + "writeable.txt");
而後將路徑寫成這個就行了!就是這麼簡單
三、讀取剛纔寫入的文件
在讀取文件內容的時候,你寫入的路徑是什麼,那麼讀的時候路徑就是什麼
try { //File file = new File("/data/data/com.test.filereadwrite/files/readable.txt"); File file = new File("/data/data/com.test.filereadwrite/files/writeable.txt"); FileInputStream fis = new FileInputStream(file); BufferedReader bffr = new BufferedReader(new InputStreamReader(fis)); String content = bffr.readLine(); Toast.makeText(MainActivity.this, content, 2000).show(); } catch (Exception e) { e.printStackTrace(); }
四、路徑優化
你們偶發現了我這裏是直接寫的路徑,那麼這樣寫並非最優化的,那麼要怎麼纔是更優化的呢,那麼久只要改兩行代碼就好啦,例如:
一、獲取路徑:
String path = Context.getFilesDir().getPath();
二、添加路徑:
File file = new File(path + "writeable.txt");
注意:咱們寫的路徑都應該是用優化的這種方式,而不該該寫死,在這裏我爲了殺雞儆猴哈哈哈~因此就寫死了……可是效果都是同樣的哇~~
生成xml文件又能夠分爲兩種方式:
一、使用原生StringBuffer拼接xml文件
二、使用Android封裝好的XmlPullParser類
兩種方式生成的xml文件是同樣的,可是我的比較喜歡第二種方式,由於簡單,就是簡單,簡單到Google工程師在開發文檔中都不用寫實例代碼……
在生成xml以前,你們先不要忘記了寫一個實體類,否則你怎麼封裝數據?告訴我怎麼封裝…………
那麼咱們這裏就直接上代碼了(實體類本身寫……)
@Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); //初始化咱們要備份的數據 smsLists = new ArrayList<Sms>(); //插入測試數據 for (int i = 0; i < 10; i++) { Sms sms = new Sms(); sms.setAddress("10086"+i); sms.setBody("你好"+i); sms.setDate("201"+i); //把sms對象加入到集合中 smsLists.add(sms); } }
一、使用原生StringBuffer拼接xml文件
//點擊按鈕button1,經過StringBuffer的方式生成一個xml文件 public void click1(View v){ //1建立一個StringBuffer對象 StringBuffer sb = new StringBuffer(); //開始組拼xml文件頭 sb.append("<?xml version=\"1.0\" encoding=\"utf-8\"?>"); //開始組拼xml根節點 sb.append("<smss>"); //開始組拼sms節點以及子節點 for (Sms sms : smsLists) { sb.append("<sms>"); //組拼addressa節點 sb.append("<address>"); sb.append(sms.getAddress()); sb.append("</address>"); //組拼body節點 sb.append("<body>"); sb.append(sms.getBody()); sb.append("</body>"); //組拼date節點 sb.append("<date>"); sb.append(sms.getDate()); sb.append("</date>"); sb.append("</sms>"); } //smss節點結束 sb.append("</smss>"); //把數據保存到SD卡中 try { File file = new File(Environment.getExternalStorageDirectory().getPath(),"smsbackup.xml"); FileOutputStream fos = new FileOutputStream(file); fos.write(sb.toString().getBytes()); fos.close(); } catch (Exception e) { e.printStackTrace(); } }
二、使用Android封裝好的XmlPullParser類
//點擊按鈕button2,經過XmlSerializer的方式生成xml文件 public void click2(View v){ try { //獲取XmlSerializer類的實例 經過xml這個工具類去獲取 XmlSerializer serializer = Xml.newSerializer(); //設置XmlSerializer序列化參數 File file = new File(Environment.getExternalStorageDirectory().getPath(),"smsbackup.xml"); FileOutputStream fos = new FileOutputStream(file); serializer.setOutput(fos,"utf-8"); //開始寫xml文檔開頭 serializer.startDocument("utf-8", true); //寫xml的根節點 namespace 命名空間 serializer.startTag(null, "smss"); //遍歷sms節點以及子節點 for (Sms sms : smsLists) { serializer.startTag(null, "sms"); //組拼addressa節點 serializer.startTag(null, "address"); serializer.text(sms.getAddress()); serializer.endTag(null, "address"); //組拼body節點 serializer.startTag(null, "body"); serializer.text(sms.getBody()); serializer.endTag(null, "body"); //組拼date節點 serializer.startTag(null, "date"); serializer.text(sms.getDate()); serializer.endTag(null, "date"); serializer.endTag(null, "sms"); } serializer.endTag(null, "smss"); //結束xml結尾 serializer.endDocument(); //關閉流 fos.close(); } catch (Exception e) { e.printStackTrace(); } }
那麼這裏就生成以下圖的xml文件:
![](http://static.javashuo.com/static/loading.gif)
三、讀取xml文件中的數據
@Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); try { //顯示數據信息 TextView tv_sms = (TextView) findViewById(R.id.tv_weather); //經過上下文 獲取資產的管理者 InputStream in = getAssets().open("smss.xml"); //調用咱們定義 解析xml的業務方法 List<Sms> smsLists = SmsParser.xmlParser(in); StringBuffer sb = new StringBuffer(); for (Sms sms : smsLists) { sb.append(sms.toString()); } //把數據顯示到TextView上 tv_sms.setText(sb.toString()); } catch (Exception e) { e.printStackTrace(); } }
部分代碼說明:
這裏我想教你們本身怎麼去看開發文檔……因此你們本身去看開發文檔吧……哈哈哈~~
ps:這裏我想說明一下,不是我不會,也不是偷懶,而是你們在之後企業開發的時候都是能夠查看開發文檔的,並且說實話Android中的東西真的不少不少,要所有記住那簡直太難啦……
因此但願你們都可以本身學會查看開發文檔……這也算是本身必修的一門課吧~~由於對於小白的我,學會了看文檔就省得不少不少的麻煩,好比忽然有一個東東不會……怎麼辦?哈哈哈……
3、總結
一、生成.txt文件的4種方法和步驟
二、生成xml文件的2種方法和步驟
三、讀取.txt文件
四、讀取xml文件
五、將數據存放在本機和SD卡中
六、學會看開發文檔
七、文件權限