2011-04-04 99 views
0

我讀&寫入用戶名&密碼到Android設備使用我的應用程序內部存儲。我成功寫入設備,但在閱讀時出現錯誤。在應用程序啓動時,我讀取該文件,並得到「應用程序(...)意外停止,請重試。」帶有「強制關閉」按鈕的,並關閉應用程序。我嘗試了不同的方式閱讀,但都顯示相同的結果。我把我的數據寫成用戶名+「\ n」+ passwrd +「\ n」。這是讀取數據的代碼:問題讀取保存的文件:Android

private static String ReadFromFile(String fileName) { 
    String text = ""; 
    FileInputStream fis = null; 
    byte[] fileData; 
    try { 
     StringBuffer sb = new StringBuffer(); 
     int c = 0; 
     fis = AppContext.openFileInput(fileName); 
     if (fis.available() != 0) { 
      fileData = new byte[fis.available()]; 
      c = fis.read(fileData); 
      Log.i(TAG, "Read Byes = " + c); 
      java.util.StringTokenizer stk = new java.util.StringTokenizer(new String(fileData), "\n"); 
      text = stk.toString(); 
     } else 
      throw new IOException("fis.available() <= 0");   /* 
     c = (char)fis.read(); 
     while (c != -1){ 
      if (c != -1) 
       sb.append(c); 
      c = (char)fis.read(); 
     } 
     text = sb.toString(); 
     */ 
     fis.close();    
    } catch (FileNotFoundException e) { 
     text = "null " + e.getMessage(); 
    } catch (IOException e) { 
     text = "null " + e.getMessage(); 
    } finally { 
     fis = null; 
    } 
    return text; 
} 

    /* 
    try { 
     StringBuffer sb = new StringBuffer(); 
     RandomAccessFile raf = new RandomAccessFile(ENC_LOGIN_FILE, "r"); 
     while ((str1 = raf.readLine()) != null){ 
      sb.append(str1); 
     } 
     str1 = sb.toString(); 
    } catch (FileNotFoundException e) { 
     errorMessage = "File Not Found: " + e.getMessage(); 
     //e.printStackTrace(); 
    } catch (IOException ioe) { 
     errorMessage = "IOExcp: " + ioe.getMessage(); 
     //e.printStackTrace(); 
    }*/ 

沒有路徑的使用和直接給出文件名寫&讀取文件。我從我嘗試過的StringTokenizer中檢出了Problem facing in reading file from Internal memory of android

任何人都可以幫助我知道我哪裏錯了。以下權限設置:

<uses-permission android:name="android.permission.INTERNET"></uses-permission> 
<uses-permission android:name="android.permission.WRITE_SECURE_SETTINGS"></uses-permission> 
<uses-permission android:name="android.permission.WRITE_SETTINGS"></uses-permission> 
<uses-permission android:name="android.permission.WRITE_SYNC_SETTINGS"></uses-permission> 
<uses-permission android:name="android.permission.READ_SYNC_SETTINGS"></uses-permission>  
<uses-permission android:name="android.permission.READ_SYNC_STATS"></uses-permission> 
<uses-permission android:name="android.permission.READ_LOGS"></uses-permission> 

另外我該如何調試應用程序。如何檢查在Log中寫入的數據。如果我使用SOP,它在哪裏顯示 - 它不顯示在控制檯窗口中?請幫助我,我是Android開發中的新手。 還有一件事要澄清:我的座右銘是存儲用戶名和密碼的方式,用戶不能直接讀取它們。我已經使用了MODE_PRIMITIVE。他們是否需要使用JSONObject來保存這些數據。我在幾個網站& API中看過JSON,但無法確定它應該使用的原因和位置。使用MODE_PRIMITIVE我相信即使用戶也不能讀取文件。只有我的應用程序可以讀取它。然後我不認爲我應該使用JSON。如果我錯了,請糾正我。

任何幫助,高度讚賞。

謝謝。

回答

1

一個建議:

如果只保存用戶名和密碼,然後使用SharedPreferences,而不是在文件中保存數據。這是一個非常安全的方式,加上很無憂無慮。

使用上如何使用共享偏好本博客文章:

http://saigeethamn.blogspot.com/2009/10/shared-preferences-android-developer.html

+0

感謝這個信息。但通過使用SharedPreferences,我的數據或至少應用程序名稱(如果我使用MODE_PRIMITIVE)將在整個設備中看到?就像我在公司看到的演示一樣,我會看到我的應用程序名稱嗎?或者沒有人能夠看到這個名字。 – Tvd 2011-04-04 10:24:51

+0

我試圖從「DEv Tools」中打開「Google LoginSErvice」,並且得到與我的應用程序相同的異常。從模擬器讀取文件有沒有問題?谷歌登錄alos可能會使用與我一樣的邏輯來讀取文件中的數據。我使用SDK 2.3.3 API 10仿真器。有這個想法嗎? – Tvd 2011-04-04 10:33:20

+0

只有您的應用名稱會像其他應用一樣可見。加上而不是使用MODE_PRIMITIVE,你可以使用MODE_PRIVATE。 sharedPreferences = getPreferences(MODE_PRIVATE); – mudit 2011-04-04 10:40:31

0
fis = AppContext.openFileInput(fileName); 
fileData = new byte[fis.available()]; 
java.util.StringTokenizer stk = 
    new java.util.StringTokenizer(new String(fileData), "\n"); 

在我看來,你想創建一個新的String使用未初始化的數組作爲輸入。你已經要求數組是特定的大小,但是你沒有做任何事情來將數據讀入數組。 (需要注意的是available()只要求可以不受阻塞讀取的數據的大小;它實際上並不讀取數據對於您所需要的read()法)

試試這個:

fis = AppContext.openFileInput(fileName); 
fileData = new byte[fis.available()]; 
fis.read(fileData); 
java.util.StringTokenizer stk = 
    new java.util.StringTokenizer(new String(fileData), "\n"); 

你應該檢查返回值fis.read(),但試試看看它是否讓你進一步進步。

+0

感謝。這樣愚蠢的錯誤。但那也失敗了。我改變了,如果(fis.availalbe()!= 0),我添加了c = fis.read(fileData);使用fileData和text = stk.toString()初始化stringTokenizer。在is的其他部分(fis.available ...)我拋出一個異常。任何一個異常都應該被捕獲,或者消息應該有一些或者爲null,但是在應用程序「App意外停止」和「強制關閉」按鈕啓動時出現相同的錯誤消息。我如何檢查日誌「Log.i」或SOP現在向哪裏以及哪裏出錯? – Tvd 2011-04-04 09:25:47

+0

@ user455979,我建議編輯帖子以包含我的建議,也許別人會知道其餘的。祝你好運。 :) – sarnold 2011-04-04 09:32:18