2017-06-19 128 views
0

我想創建一個目錄,然後將數據寫入外部SD卡上的新文件。我之前已經成功地將文件寫入內部存儲器,但是由於這只是我的第二個應用程序,所以我似乎遇到了2個問題(除了我自己之外)。創建文件夾並將文件寫入外部存儲

已經搜索到的關於計算器的意見和示例代碼長度,我已經建立了以下方法:

void filewriter(String fnam,String mdata){ 
     if (useSD) { 
      //test to see if a directory called AMJ exists on external storage and create one if it does not 
      try { 
       File folder = new File(Environment.getExternalStorageDirectory() + "/AMJ"); 
       if (folder.exists() && folder.isDirectory()) { 

        Toast.makeText(getApplicationContext(), "folder " + folder + " exists", Toast.LENGTH_LONG).show(); //##1 
       } else { 
        Toast.makeText(getApplicationContext(), "folder " + folder + " does not exist", Toast.LENGTH_LONG).show(); //##2 
        folder.mkdirs(); 
       } 
      } catch (Exception e) { 
       Toast.makeText(getApplicationContext(), "Unable to find or create a directory for route data on SD card", Toast.LENGTH_LONG).show(); //##3 
      } 
      //create a file with file name fnam and write String mdata into the AMJ directory 
      try { 
       String namFile = Environment.getExternalStorageDirectory() + "/AMJ/" + fnam; 
       File datfile = new File(namFile); 
       Toast.makeText(getApplicationContext(), "File is: " + datfile, Toast.LENGTH_LONG).show(); //##4 
       datfile.createNewFile(); 
       FileOutputStream fOut = new FileOutputStream(datfile); 
       OutputStreamWriter myOutWriter = new OutputStreamWriter(fOut); 
       myOutWriter.append(mdata); 
       myOutWriter.close(); 
       fOut.close(); 
       Toast.makeText(getApplicationContext(), "Finished writing to SD", Toast.LENGTH_LONG).show(); //##5 
      } catch (Exception e) { 
       Toast.makeText(getApplicationContext(), "Write failure", Toast.LENGTH_SHORT).show(); //##6 
      } 
     } 
    } 

fnam和MDATA是簡單的文本,如「MYFILE」和「這是我的測試數據」。

第一個問題是,我第一次運行這個時,我得到了祝酒信息## 2(文件夾不存在),如我所料。但是,我期望創建一個AMJ目錄,以便下次運行代碼時我會得到消息## 1來表示該目錄現在存在,但這不會發生 - 它仍然表示該目錄不存在。

第二個問題(當然可能只是第一個問題的結果)是文件創建/寫入不起作用,每次都會收到'catch'消息## 6。

我的清單看起來是這樣的:

package="com.example.chris.filewritetests"> 
    <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" /> 
    <uses-permission android:name="android.permission.STORAGE" /> 
    <uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE" /> 

我在Android模擬器工作室運行此。

有誰能告訴我這裏有什麼問題嗎?

+0

擺脫所有的「敬酒」。使用'Log.e()'將消息記錄到LogCat中,特別是記錄你在'catch'塊中獲得的特定異常。此外,沒有'android.permission.STORAGE'權限,您可能沒有[運行時權限]的代碼(https://developer.android.com/training/permissions/requesting.html),您最終可能希望[獲取此文件索引,以便它顯示爲用戶](https://stackoverflow.com/questions/32789157/how-to-write-files-to-external-public-storage-in-android-so-that-他們,是-visibl)。 – CommonsWare

回答

0

該目錄不是自動創建的。 您需要創建這些目錄調用的mkdir()文件對象 datfile.mkdirs() 變化就可以了TI

try { 
      String namFile = Environment.getExternalStorageDirectory() + "/AMJ/" + fnam; 
      File datfile = new File(namFile); 
      datfile.mkdirs(); 
      Toast.makeText(getApplicationContext(), "File is: " + datfile, Toast.LENGTH_LONG).show(); //##4 
      FileOutputStream fOut = new FileOutputStream(datfile); 
      OutputStreamWriter myOutWriter = new OutputStreamWriter(fOut); 
      myOutWriter.append(mdata); 
      myOutWriter.close(); 
      fOut.close(); 
      Toast.makeText(getApplicationContext(), "Finished writing to SD", Toast.LENGTH_LONG).show(); //##5 
     } catch (Exception e) { 
      Toast.makeText(getApplicationContext(), "Write failure", Toast.LENGTH_SHORT).show(); //##6 
     } 
+0

我按照建議嘗試了這段代碼,但沒有奏效。它在datfile.createNewFile()行失敗。我在設置文件路徑和名稱的方式做錯了什麼(String namFile = ..........)? –

+0

你不需要第一個如果檢查文件夾是否存在,因爲'mkdirs()'爲你做了,而'createNewFile()'也不需要。 – Adithya

0

建議使用Log.e()幫點我在正確的方向 - 謝謝。我認爲我的問題是我沒有意識到內置存儲器和SD卡不一定與內部和外部存儲器相同,並且設備有時可以使用SD卡上的內存作爲「內部」。

我發現當我在真實設備上運行代碼時發生了什麼,一個是SD卡,另一個是沒有SD卡,而不是使用模擬器。這使得使用設備的FileCommander可以輕鬆查看文件夾和文件的創建位置。我會建議任何人與這種問題鬥爭。

相關問題