2017-06-03 120 views
0

我正在嘗試將文件寫入手機(以及未來用戶手機上)的內部設備存儲器中。我正在觀看2016年的視頻教程(https://www.youtube.com/watch?v=EhBBWVydcH8),它顯示了他如何將輸出寫入文件非常簡單。如果你想看他的代碼,請跳到8:23。Android Studio - 只讀文件系統?

無論如何,我基本上試過他的代碼,然後既然沒有工作,我想四處搜尋。

顯然,創建一個文件,我需要幾行代碼:

String filename = "textfile.txt"; 
File file = new File(filename); 

file.mkdirs(); 
file.createNewFile(); 

在第二行,file.createNewFile(),我得到下面的錯誤:

java.io.IOException: Read-only file system 
    at java.io.UnixFileSystem.createFileExclusivel 
    at java.io.UnixFileSystem.createFileExclusivel 
    at java.io.File.createNewFile(File.java:948) 
    etc...... 

而且那麼,如果我只是使用教程中的代碼行來運行我的代碼,那麼我會得到一個空指針。

代碼:

  try { 
      FileOutputStream fos = openFileOutput(filename, Context.MODE_PRIVATE); 
      fos.write(IDNum.getBytes()); 
      fos.close(); 
      System.out.println("Wrote STuff Outputtt?"); 
     } catch (Exception e) { 
      e.printStackTrace(); 
     } 

錯誤:

java.lang.NullPointerException: Attempt to invoke virtual method 'java.io.FileOutputStream android.content.Context.openFileOutput(java.lang.String, int)' on a null object reference 
    at android.content.ContextWrapper.openFileOutput(ContextWrapper.java:199) 
    at com.lecconnect.lockoutdemo.FileManager.AddUser(FileManager.java:37) 

37號線是在try/catch語句的第一行。

如果您需要任何其他信息來幫助我,請讓我知道。非常感謝您的答覆。

+0

你'FileManager'類顯然延伸的類,你不應該用'new'被實例化;像「活動」或「服務」。我假設你這樣做,以便'openFileOutput()'可以解決。你不能那樣做,因爲最終調用的'Context'將會是null,就像你在trace中看到的一樣。如果你想把這個方法保存在一個單獨的類中,可以在'AddUser()'中添加一個'Context'參數,並從'Activity','Service'等等中傳入一個參數。我還應該提到'openFileOutput() '在應用的私人內部存儲器中打開文件,這可能不是您所期望的。 –

+0

@MikeM。我通過解析「openFileOutput()」去除了「... extends Activity」,正如你所假設的那樣。我現在通過我的其他活動傳遞情景。導致錯誤的行被重寫爲「FileOutputStream fos = context.openFileOutput(filename,Context.MODE_PRIVATE);」看起來我的代碼不會崩潰,但我無法在任何地方找到我的文本文件lol。我去了Internal_Storage/Android/Data/com.outputproject/demo,該文件應該在那裏,而且不在那裏。這是你內部私人部門的意思,對嗎?或者是不能被看到的私人文件?這個位置沒問題。 – FoxDonut

+0

使用追加模式不會改變 - 它看起來像一切運行良好,但無法找到.txt文檔的位置。或者,也許我濫用上下文? – FoxDonut

回答

1

分開目錄和文件本身很重要。 在你的代碼中,你需要在你想寫的文件上調用mkdirs,因爲mkdirs會使你的文件成爲一個目錄。您應該僅爲該目錄調用mkdirs,以便在其不存在的情況下創建它,並且在爲該文件創建新的FileOutputStream對象時將自動創建該文件。

試試這個:

File directory = getFilesDir(); //or getExternalFilesDir(null); for external storage 
File file = new File(directory, fileName); 

FileOutputStream fos = null; 
try { 
    fos = new FileOutputStream(file); 
    fos.write(IDNum.getBytes()); 
    fos.close(); 
} catch (IOException e) { 
    e.printStackTrace(); 
} 
+0

這不會寫入外部存儲?我想寫給內部。 – FoxDonut

+0

請檢查編輯的答案。 –

相關問題