2016-04-26 70 views
1

我一直在爲在Galaxy S4的SD卡上存儲ArrayList而苦苦掙扎。對於我似乎無法找出我自己的原因,我不斷收到文件未發現異常在這段代碼:Android SDK外部存儲,找不到文件

File file = new File(Environment.getExternalStorageDirectory(), name); 

     if(file.exists()) file.delete(); 
     try{     
       OutputStream os = new FileOutputStream(file); 
       OutputStreamWriter osw = new OutputStreamWriter(os); 
       for(int j = 0; j < fallList.size(); j++) 
       osw.write(fallList.get(j)); 
       os.close(); 
       osw.close(); 

      } catch (FileNotFoundException e){ 

       Toast.makeText(getApplicationContext(),"File Not Found",Toast.LENGTH_LONG).show(); 

       e.printStackTrace(); 
      } 

編輯:

正確添加權限後,我不再得到文件未發現異常,但是發生IOException。我注意到在設備監視一些系統錯誤:

04-26 13:54:15.115:d/ViewRootImpl(27953):ViewPostImeInputStage ACTION_DOWN 04-26 13:54:20.130:d/ViewRootImpl(27953): ViewPostImeInputStage ACTION_DOWN 04-26 13:54:20.270:W/System.err的(27953):產生java.io.IOException:文件描述符關閉 04-26 13:54:20.280:W/System.err的(27953):在libcore.io.Posix.writeBytes(Native Method) 04-26 13:54:20.310:W/System.err(27953):at libcore.io.Posix.write(Posix.java:223) 04-26 13 :54:20.310:W/System.err(27953):在libcore.io.BlockGuardOs.write(BlockGuardOs.java:313) 04-26 13:54:20.310:W/System.err(27953):在libcore .io.IoBridge.write(IoBridge.java:497) 04-26 13:54:20.310:W/System.err(27953):在java.io.FileOutputStream.write(FileOutputStream.java:186) 04-26 13:54:20.310:W/System.err 27953):在java.io.OutputStreamWriter.flushBytes(OutputStreamWriter.java:167) 04-26 13:54:20.310:W/System.err的(27953):在java.io.OutputStreamWriter.close(OutputStreamWriter.java: 140) 04-26 13:54:20.310:W/System.err的(27953):在com.example.med603.sharedpreffalldetect.MainActivity.toFile(MainActivity.java:142) 04-26 13:54:20.310: W/System.err(27953):at com.example.med603.sharedpreffalldetect.MainActivity.access $ 000(MainActivity.java:35) 04-26 13:54:20.310:W/System.err(27953):at com .example.med603.sharedpreffalldetect.MainActivity $ 2.onClick(MainActivity.java:73) 04-26 13:54:20.310:W/System.err(27953):at android.view.View.performClick(View.ja va:5197) 04-26 13:54:20.310:W/System.err(27953):at android.view.View $ PerformClick.run(View.java:20926) 04-26 13:54:20.310: W/System.err(27953):at android.os.Handler.handleCallback(Handler.java:739) 04-26 13:54:20.310:W/System.err(27953):at android.os.Handler。 dispatchMessage(Handler.java:95) 04-26 13:54:20.310:W/System.err(27953):at android.os.Looper.loop(Looper.java:145) 04-26 13:54: 20.310:W/System.err(27953):at android.app.ActivityThread.main(ActivityThread.java:5951) 04-26 13:54:20.320:W/System.err(27953):at java.lang。 reflect.Method.invoke(Native Method) 04-26 13:54:20.320:W/System.err(27953):at java.lang.reflect.Method.invoke(Method.java:372) 04-26 13 :54:20.320:W/System.err(27953):at com.android.internal.os.ZygoteIni t $ MethodAndArgsCaller.run(ZygoteInit.java:1400) 04-26 13:54:20.320:W/System.err(27953):at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:1195)

我以前沒有使用過d.log,所以我不完全知道我在尋找什麼在這裏。

+0

'Environment.getExternalStorageDirectory()'不會保證這將返回您的SD卡路徑。檢查外部安裝的存儲。在這裏閱讀更多http://developer.android.com/guide/topics/data/data-storage.html#filesExternal –

+0

您需要'WRITE_EXTERNAL_STORAGE'權限才能在那裏寫入。如果你認爲你的設置正確,[我的這篇博客文章](https://commonsware.com/blog/2015/08/31/hey-where-did-my-permission-go.html)概述一些常見的原因,爲什麼你可能仍然沒有這種權限。您也可以考慮編輯您的問題併發布您應該在LogCat中看到的Java堆棧跟蹤。 – CommonsWare

+0

感謝您的鏈接夥計們。我會檢查他們。 之後我會看到有關發佈Java堆棧跟蹤的信息! –

回答

0
  1. 檢查在AndroidManifest.xml您的權限。您需要對外部存儲的READ & WRITE權限。
  2. 嘗試使用不同的目錄。例如,getExternalStoragePublicDirectory(Environment.DIRECTORY_DOWNLOADS)
+0

感謝您的迅速回應。我在清單中擁有權限,既可以讀取也可以寫入,並且我首先嚐試將數據存儲在Environment.DIRECTORY_DOCUMENTS中 - 同時還獲取文件未找到的異常。 –

0

所以我想通了;首先,當我「重新執行」應用程序時,我忘記了權限(第一次嘗試太亂了) - 這解決了文件未找到異常!

然後我得到了一個IOException,這似乎是因爲我沒有刷新OutputStreamWriter。