2010-06-27 185 views
3

我正在爲自己編寫一個簡單的預算應用程序,而且我很難弄清楚如何寫入內部存儲。我似乎沒有正確地寫入文件,並且我找不到更深入的示例,比Data Storage article on developer.android.com在閱讀和寫入內部存儲時遇到問題android

基本上,我試圖寫一個測試浮點到MyBalance文件,然後將其讀入餘額。在我的實際代碼中,我使用圍繞文件輸入/輸出操作的try/catch語句,但是我跳過它們以使代碼更具可讀性。

float test = 55; 
float balance; 
byte[] buffer = null; 
FileOutputStream fos = openFileOutput("MyBalance", Context.MODE_PRIVATE); 
fos.write(Float.floatToRawIntBits(balance)); 
fis.read(buffer); //null pointer 
ByteBuffer b = ByteBuffer.wrap(buffer); 
balance=b.getFloat(); 

這就是它的要義,任何人看到我做錯了什麼?

編輯: 感謝您的答覆,我繼續前進並轉換爲/從字符串像你建議的,但我仍然不認爲該文件正在創建。如果它存在於onResume()中並且它沒有運行,那麼我有一條if語句可以讀取它。 Lemme發佈了我的一些代碼。

以下是我正在寫的文件,(setbal是一個EditText和balanceview是一個TextView):

balance = Float.valueOf(setbal.getText().toString()); 
balanceview.setText(setbal.getText()); 
balstring = String.valueOf(balance); 
for (int i = 0; i < balstring.length(); ++i) 
    try { 
    fos.write((byte)balstring.charAt(i)); 
    } catch (IOException e) { 
     e.printStackTrace(); 
    } 

我檢查,如果該文件中的onResume()存在像這樣:

File file = new File("data/data/com.v1nsai.mibudget/balance.txt"); 

是否存儲該內容的內部文件?

回答

5

所以這不完全是你要求的,但這是我如何使它爲字符串工作,並且它可能對你有幫助。 (你可以框primatives和toString他們當然,如果你想使用此代碼。)

寫作

FileOutputStream fos = context.openFileOutput("savedstate.txt", 0); 

for (int i = 0; i < out.length(); ++i) 
    fos.write((byte)out.charAt(i)); 

閱讀

StringBuilder inb = new StringBuilder(); 

FileInputStream fis = this.mContext.openFileInput("savedstate.txt"); 

int ch; 
while((ch = fis.read()) != -1) 
    inb.append((char)ch); 

更新

想到的一個想法是,你可能不會想要用手輸入文件對象的完整路徑來信任使用File對象。相反,只需使用帶有上下文對象的FileInputStream和我的代碼中的相對路徑,然後查看是否返回某個長度的字符串或類似的東西,或者該文件不存在的異常。

如果您真的好奇創建文件的位置,或者想親眼看到它,我相信您可以通過DDMS中的文件管理器在手機上瀏覽它。

最後一件事,我建議將try/catch塊移到寫循環之外。由於它是一個重複的任務,所以不需要這種方法的開銷,儘管最大限度地減少try/catch塊的大小是一種很好的做法。

真的可以最後一件事,如果你想使用File對象的完整路徑,你可能希望有路徑如下所示:

File file = new File("/data/data/com.v1nsai.mibudget/balance.txt"); 

剛開始削減可能使所有的差異。