編輯:關於android開發
今天嘗試使用java.util.Properties來保存應用配置,然而遇到了好幾個問題,對於熟悉此內容的來說可能都是豬一樣的錯誤,但難免有像我一樣的新手再次遇到,希望此文能有所幫助。
錯誤1
java.io.IOException: open failed: EROFS (Read-only file system)
at java.io.File.createNewFile(File.java:940)
出錯代碼:
1 File file = new File("config.properties"); 2 if(!file.exists()){ 3 file.createNewFile(); 4 }
本代碼是用於在應用被初次啟用,創建用來保存配置信息的文件。
出錯原因:對於這樣創建的config.propeties文件是放在應用的包目錄下的,對於這樣的文件,最好的方法是使用絕對路徑來創建file。參考http://stackoverflow.com/questions/16847151/error-while-creating-a-new-file-in-android-filenotfoundexception-test-png-op,
修改:
String appDir = getApplicationContext().getFilesDir().toString(); File file = new File(appDir + "/" + "config.properties"); if(!file.exists()){ file.createNewFile(); }
先通過getApplicationContext().getFilesDir().toString()獲取本應用包目錄的絕對路徑,然後再創建文件。絕對路徑為“/data/data/com.company.App/files/”,com.company.App表示你的應用包名。
錯誤2
java.lang.IllegalArgumentException: File /data/data/com.example.basictest2/files/aa.properties contains a path separator
at android.app.ContextImpl.makeFilename(ContextImpl.java:1805)
at android.app.ContextImpl.openFileInput(ContextImpl.java:767)
at android.content.ContextWrapper.openFileInput(ContextWrapper.java:166)
出錯代碼:
Properties properties = new Properties(); properties.load(getApplicationContext().openFileInput(appDir + "/" + “config.properties”));
這個真是豬一樣的錯誤,因為有了前面一個錯誤,所以我也就把這裡也改成了絕對路徑,但是在API文檔中(http://www.android-doc.com/reference/android/content/Context.html#openFileInput(java.lang.String)寫的清清楚楚,傳入的參數是“The name of the file to open; can not contain path separators.”,只要“config.properties”即文件名就夠了!犯這個錯誤的原因也是因為我看了一些網上的文章就開始寫,而沒有認真看下API文檔,以此為戒,遇到新東西,首先看官方文檔。
錯誤3
java.lang.NullPointerException
at java.util.Hashtable.put(Hashtable.java:365)
at java.util.Properties.setProperty(Properties.java:511)
出錯代碼:
//代碼運行到這裡,valueString為null Properties properties = new Properties(); properties.setProperty(keyString, valueString);
這個也是同上面的錯誤一樣,在API文檔(http://www.android-doc.com/reference/java/util/Properties.html#setProperty(java.lang.String, java.lang.String)中清楚的寫了:The key and value cannot be null。由於代碼在邏輯上沒有考慮到此處valueString的依然為null,所以導致此錯誤,還是那句話:多看API文檔!
還有中間還考慮過權限的問題,其實讀寫自己包私有的文件是不需要申請權限的,包括android.permission.WRITE_EXTERNAL_STORAGE也不需要申請。
最後貼上最終正確的代碼,其實還是比較簡單的。寫此文的目的就是告訴自己:多看API文檔!
1 private final String CONFIG_KEY = "CONFIG_KEY"; 2 private final String CONFIG_FILE = "config.properties"; 3 private String mConfigValue; 4 5 //讀取配置參數值mConfigValue,啟動應用的時候調用 6 private void configInit(){ 7 try { 8 File file = new File(getFilesDir() + "/" + CONFIG_FILE); 9 if(!file.exists()){ 10 file.createNewFile(); 11 } 12 Properties properties = new Properties(); 13 //openFileInput不會自己創建不存在的文件,會拋出FileNotFoundException異常 14 properties.load(getApplicationContext().openFileInput(CONFIG_FILE)); 15 mConfigValue = (String)properties.get(CONFIG_KEY); 16 } catch (Exception e) { 17 e.printStackTrace(); 18 // TODO: handle exception 19 } 20 } 21 22 //配置參數值mConfigValue被修改,保存到配置文件 23 private void saveConfig(){ 24 try { 25 Properties properties = new Properties(); 26 if(mConfigValue != null){ 27 properties.setProperty(CONFIG_KEY, mConfigValue); 28 } 29 //當CONFIG_FILE文件不存在的時候,openFileOutput則會新建此文件 30 //這裡需要了解下openFileOutput的第二個參數mode: 31 //http://www.android-doc.com/reference/android/content/Context.html#MODE_PRIVATE 32 properties.store(getApplicationContext().openFileOutput(CONFIG_FILE, MODE_PRIVATE),null); 33 } catch (Exception e) { 34 // TODO: handle exception 35 e.printStackTrace(); 36 } 37 }
最後,關於Properties推薦一個比較好的應用教程Java Properties file examples:http://www.mkyong.com/java/java-properties-file-examples/
Android--音樂播放器 1、什麼是Open Core? Open Core是 Android 多媒體框架的核心,所有 Android平台的音頻、視頻的采用以及播
推送:騰迅信鴿 VS Bmob,信鴿bmob最近幾天了解市場上主流的推送SDK。 騰迅信鴿 所需SDK,去官網自行下載。去下載 完整的清單文件如下: 1
Android 手機衛士--是否有密碼區分對話框類型,android衛士本文開始逐步實現設置中心的“手機防盜”功能模塊 本文地址:/www.cn
TabWidgetDemo,androidwidgetdemoTabWidget可以通過不同的標簽進行切換並且顯示不同的內容,相當於Button按鈕實現不同的功能。 Ta