天天看點

Android Day02-檔案操作-登陸示例

需求:登陸

第1步:搭建UI

    采用混合布局,布局搭建好之後如下所示:

第2步:準備工作

    根據javaWeb中的mvc+dao的開發模式,建立好包名和類。

第3步:業務邏輯

    就是一個存值和取值的過程,也可以說是讀寫檔案的過程。

    注意在擷取路徑的時候,不要使用硬性編碼(hardcode)。

關鍵知識點梳理:

    ▇擷取應用程式的files私有目錄:"/data/data/應用程式包名/files"

         方式1:得路徑,再得到流。

            File context.getFilesDir()

     <--  補充一下 File context.getCacheDir()    表示得到緩存目錄/caches-->

        方式2:直接得到流

           檔案讀取流:InputStream in = context.openFileInput("檔案名(帶字尾)");        

           檔案寫入流:OutputStream out  = context.openFileOutput("user.txt",                                    Context.MODE_PRIVATE);//有2個參數,第2個參數

                        表示檔案的權限。

    ▇擷取裝置的SD卡目錄:

        →1.注意要配置sd的通路權限。

        →2.判斷sd卡的狀态。    

<code>String storageState = Environment.getExternalStorageState();</code>

<code>if</code><code>(!storageState.equals(Environment.MEDIA_MOUNTED))</code>

<code>{</code>

<code>    </code><code>//如果挂起,提示使用者sd卡不存在。</code>

<code>    </code><code>Toast.makeText(mainContext, </code><code>"sd卡不存在"</code><code>, Toast.LENGTH_SHORT).show();</code>

<code>    </code><code>return</code><code>;</code>

<code>}</code>

        →3.判斷sd卡空間容量資訊。

<code>//假如SD卡小于200M就提示記憶體不足</code>

<code>//首先擷取外部存儲的目錄 File對象</code>

<code>    </code><code>File file_storage = Environment.getExternalStorageDirectory();</code>

<code>//通過File對象來獲得外部存儲的可用空間</code>

<code>    </code><code>Long useable_storage = file_storage.getUsableSpace();</code>

<code>    </code><code>//将位元組轉換成易于閱讀的M表示方法</code>

<code>        </code><code>String useable_storage_mstr = Formatter.formatFileSize(mainContext,useable_storage);</code>

<code>                        </code> 

<code>//得到外部存儲的總空間</code>

<code>    </code><code>Long total_storage = file_storage.getTotalSpace();</code>

<code>    </code><code>String total_storage_mstr = Formatter.formatFileSize(mainContext, total_storage);</code>

<code>        </code><code>if</code><code>(useable_storage &lt; </code><code>1024</code><code>*</code><code>1024</code><code>*</code><code>200</code><code>)</code>

<code>    </code><code>{</code>

<code>        </code><code>Toast.makeText(mainContext, </code><code>"外部存儲空間不足,剩餘可用空間為:"</code>

<code>                    </code><code>+ useable_storage_mstr +</code><code>"M"</code>  

<code>                    </code><code>+ </code><code>",總空間為:"</code> <code>+ total_storage_mstr + </code><code>"M"</code>

<code>                    </code><code>, Toast.LENGTH_LONG).show();</code>

<code>        </code><code>return</code><code>;</code>

<code>    </code><code>}</code>

        通過linux指令df /sdcard來獲得外部裝置外部存儲的資訊:

     ▇擷取資産檔案夾Asset目錄下的檔案輸入流:

<code>//擷取上下文的所有資源對象</code>

<code>Resources res = context.getResources();</code>

<code>//從資源對象中擷取資産目錄Asset的管理器AssetManager</code>

<code>AssetManager manager = res.getAssets();</code>

<code>//利用管理器的open方法擷取它的目錄下指定檔案的讀取流</code>

<code>InputStream in = manager.open(</code><code>"user.txt"</code><code>);</code>

     ▇Preferences:"/data/data/應用程式包名/shared_prefs"

       用于存放一些簡單的标記資訊、設定資訊。通過xml檔案在實作儲存和取出。

       Preferences存儲檔案流程

<code>//第1步:通過上下文對象得到SharedPreferences對象</code>

<code>        </code><code>SharedPreferences user_pref =  context.getSharedPreferences(</code><code>"user.txt"</code><code>, Context.MODE_PRIVATE);</code>

<code>//第2步:得到SharedPreferences的Editor對象</code>

<code>    </code><code>Editor user_editor = user_pref.edit();</code>

<code>//第3步:通過Editor向SharedPreferences對象裡面設定值,類似map中的鍵和值 。</code>

<code>    </code><code>user_editor.putString(</code><code>"username"</code><code>, user.getUsername()); </code>

<code>    </code><code>user_editor.putString(</code><code>"password"</code><code>, user.getPassword());</code>

<code>//第4步:送出Editor</code>

<code>    </code><code>return</code> <code>user_editor.commit();</code>

      Preferences讀取檔案内容

<code>        </code><code>SharedPreferences user_share = context.getSharedPreferences(</code><code>"user.txt"</code><code>, Context.MODE_PRIVATE);</code>

<code>//第2步:得到share對象的資料</code>

<code>    </code><code>String username = user_share.getString(</code><code>"username"</code><code>, </code><code>"使用者名找不到"</code><code>);</code>

<code>    </code><code>String password = user_share.getString(</code><code>"password"</code><code>, </code><code>"密碼找不到"</code><code>); </code>

<code>    </code><code>//上面getString方法的第二個參數為找不到指定鍵名的時候傳回的預設值。</code>

    通過總結可以發現,上面的這些檔案讀取流,都隻能讀取目前應用程式的私有目錄下的檔案流,有局限性。如果要想跨應用讀取資料,還是得結合一般IO流。

    今天還講了XML的解析和序列化,和javaWeb中的xml的解析及序列化十分的相似,隻是擷取解析器和序列器的方式稍有不同,是通過Xml這個類直接擷取的。

Android 開發時如何正确擷取使用擴充存儲路徑

    作為一個程式員,想必你也很讨厭App在SD卡根目錄亂建目錄吧,那就從我做起,來遵守Google的這一規定吧。

    通過Context.getExternalFilesDir()方法可以擷取到 SDCard/Android/data/{package_name}/files/ ,儲存一些長時間儲存的資料;

    通過Context.getExternalCacheDir()方法可以擷取到 SDCard/Android/data/{package_name}/cache/,儲存臨時緩存資料;

    這兩個目錄分别對應 設定-&gt;應用-&gt;應用詳情裡面的”清除資料“與”清除緩存“選項。

      本文轉自屠夫章哥  51CTO部落格,原文連結:http://blog.51cto.com/4259297/1674699,如需轉載請自行聯系原作者

繼續閱讀