2011-08-13 47 views
0

我在模擬器中的SD卡上寫入文件時出現問題。這裏是我的代碼:將文件保存在SD卡上

File directory; 
directory = new File("/sdcard/b/b"); 
directory.mkdirs(); 
... 
XmlSerializer serializer = Xml.newSerializer(); 
StringWriter writer = new StringWriter(); 
serializer.setOutput(writer); 
... 
String fileName = new Date().toString(); 

FileOutputStream fOut = healthCareApplication.openFileOutput("/sdcard/b/b"+fileName+".xml",Context.MODE_WORLD_READABLE); 
OutputStreamWriter osw = new OutputStreamWriter(fOut); 
osw.write(writer.toString()); 
osw.flush(); 
osw.close(); 

首先我在SD卡上創建目錄,然後我建立一些XML文件。然後我嘗試創建一個文件並嘗試將此XML文件保存到此目錄,但是IllegalArgumentException和應用程序崩潰。 「healthCareApplication」是擴展應用程序類的類。這段代碼有什麼問題?

EDIT

好的,我添加 「Environment.getExternalStorageDirectory()getAbsolutePath();」。這裏就是我在logcat中得到:

08-13 16:29:34.168: ERROR/AndroidRuntime(419): FATAL EXCEPTION: pool-1-thread-5 
08-13 16:29:34.168: ERROR/AndroidRuntime(419): java.lang.IllegalArgumentException: File /mnt/sdcard/c/c/Sat Aug 13 16:29:34 GMT+00:00 2011.xml contains a path separator 
08-13 16:29:34.168: ERROR/AndroidRuntime(419):  at android.app.ContextImpl.makeFilename(ContextImpl.java:1648) 
08-13 16:29:34.168: ERROR/AndroidRuntime(419):  at android.app.ContextImpl.openFileOutput(ContextImpl.java:414) 
08-13 16:29:34.168: ERROR/AndroidRuntime(419):  at android.content.ContextWrapper.openFileOutput(ContextWrapper.java:158) 
08-13 16:29:34.168: ERROR/AndroidRuntime(419):  at com.myapp.runnable.ServerWorker.packageToXML(ServerWorker.java:197) 
08-13 16:29:34.168: ERROR/AndroidRuntime(419):  at com.myapp.runnable.ServerWorker.run(ServerWorker.java:85) 
08-13 16:29:34.168: ERROR/AndroidRuntime(419):  at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1088) 
08-13 16:29:34.168: ERROR/AndroidRuntime(419):  at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:581) 
08-13 16:29:34.168: ERROR/AndroidRuntime(419):  at java.lang.Thread.run(Thread.java:1019) 

當我檢查DDMS我看到文件夾在SD卡創建的,但在該目錄中沒有這樣可能當應用程序試圖寫文件到SD卡中發生的問題。

我也更換

"FileOutputStream fOut = healthCareApplication.openFileOutput("/sdcard/b/b"+fileName+".xml",Context.MODE_WORLD_READABLE);" 

File outputFile = new File(wallpaperDirectory, fileName); 
FileOutputStream fos = new FileOutputStream(outputFile); 

,並得到另一個異常:

08-13 16:46:56.108: INFO/IOException(3110): /Sat Aug 13 16:46:56 GMT+00:00 2011 (Read-only file system) 
+4

只是一個普遍的建議:*從不*硬編碼的存儲路徑,如SD卡。使用'Environment.getExternalStorageDirectory()'。有些設備沒有SD卡,只能依靠內置閃存或將其完全安裝到其他位置。 – 2011-08-13 13:43:40

+1

此外,'/ sdcard'對於目前使用的大多數Android設備來說只是錯誤的。使用'Environment.getExternalStorageDirectory()',並確保具有'WRITE_EXTERNAL_STORAGE'權限。如果這沒有幫助,請使用Eclipse中的'adb logcat',DDMS或DDMS透視圖來檢查LogCat並查看崩潰發生的位置。 – CommonsWare

+0

發佈完整的LogCat輸出。 –

回答

1

產生第一個例外,因爲new Date().toString();正在生成的文件名包含冒號( :)。這在文件名中是非法的。

它看起來像wallpaperDirectory的第二個異常是空白的,因爲正在生成異常,因爲您正在嘗試寫入/目錄(這是隻讀)。