2013-03-05 42 views
1

我想創建一個應用程序,用戶選擇一些複選框,然後當它們提交時創建一個.txt文件,併爲每個選中的複選框添加一個句子。Android應用程序來創建.txt文件

我已經有一個成功的版本,它創建了正確的文件,但我需要它保存到一個可訪問的文件位置,以便它可以連接到電子郵件。只要可以訪問,我並不在乎它保存在哪裏。

以下代碼在Android虛擬設備和我的Galaxy 2中運行時會導致崩潰。該應用程序是以後應用程序的概念證明。謝謝。

 @Override 
     public void onClick(View v) 
     { 
      String nochartOutput = " ";  
      if (sitting.isChecked()) 
       nochartOutput += "The patient was sitting in a chair. "; 
      if (breathing.isChecked()) 
       nochartOutput += "The patient was breathing. "; 
      if (alert.isChecked()) 
       nochartOutput += "The patient was alert. "; 

      FileOutputStream fOut = null; 
      File sdDir = Environment.getExternalStorageDirectory(); 
      try { 
       fOut = openFileOutput(sdDir + "/AutoWriter/samplefile.txt",MODE_WORLD_READABLE); 
      } catch (FileNotFoundException e) { 
       e.printStackTrace(); 
      } 
      OutputStreamWriter osw = new OutputStreamWriter(fOut); 
      try { 
       osw.write(nochartOutput); 

       osw.flush(); 
       osw.close(); 
      } catch (IOException e) { 
       e.printStackTrace(); 
      } 
     } 

03-04 18:39:53.604:W/dalvikvm(10453):線程ID = 1:螺紋與未捕獲的異常(組= 0x40c211f8)

03-04 18時39分離開: 53.624:E/AndroidRuntime(10453):致命例外:主

03-04 18:39:53.624:E/AndroidRuntime(10453):java.lang.IllegalArgumentException:文件/mnt/sdcard/samplefile.txt包含路徑分隔符

03-04 18:39:53.624:E/AndroidRuntime(10453):at andr oid.app.ContextImpl.makeFilename(ContextImpl.java:1703)

03-04 18:39:53.624:E/AndroidRuntime(10453):在android.app.ContextImpl.openFileOutput(ContextImpl.java:723)

03-04 18:39:53.624:E/AndroidRuntime(10453):在android.content.ContextWrapper.openFileOutput(ContextWrapper.java:165)

03-04 18:39:53.624:E/AndroidRuntime (10453):at com.example.com.dresdor.autowriter.MainActivity $ 1.onClick(MainActivity.java:48)

03-04 18:39:53.624:E/AndroidRuntime(10453):at android.view .View.performClick(View.java:3620)

03-04 18:39:53.624:E/AndroidRuntime(10453):在android.view.View $ PerformClick.run(View.java:14292)

03-04 18:39:53.624: E/AndroidRuntime(10453):at android.os.Handler.handleCallback(Handler.java:605)

03-04 18:39:53.624:E/AndroidRuntime(10453):at android.os.Handler.dispatchMessage (Handler.java:92)

03-04 18:39:53.624:E/AndroidRuntime(10453):在android.os.Looper.loop(Looper.java:137)

一月3日至4日8:39:53.624:E/AndroidRuntime(10453):at android.app.ActivityThread.main(ActivityThread.java:4507)

03-04 18:39:53.624:E/AndroidRuntime(10453):at java .lang.reflect.Method.invokeNative(Native Method)

03-04 18:39:53.624:E/AndroidRuntime(10453):at java.lang.reflect.Method.invoke(Method.java:511)

03-04 18:39:53.624:E/AndroidRuntime(10453):在com.android.internal.os.ZygoteInit $ MethodAndArgsCaller.run(ZygoteInit.java:790)

03-04 18點39分:53.624:E/AndroidRuntime(10453):在com.android.internal.os.ZygoteInit.main (ZygoteInit。的java:557)

03-04 18:39:53.624:E/AndroidRuntime(10453):在dalvik.system.NativeStart.main(本機方法)

+0

你可以在logcat中添加錯誤嗎? – NaviRamyle 2013-03-05 02:30:29

回答

3

您現有的代碼是寫入內部存儲和外部存儲的混搭。該生產線

fOut = openFileOutput(sdDir + "/AutoWriter/samplefile.txt",MODE_WORLD_READABLE); 

試圖創建的應用程序的私有數據目錄中的文件,你只能通過文件名來此方法而不是更深的路徑。這就是崩潰來臨的地方,但這不是你想要的。

您開始創建一個外部存儲路徑,但從未實際使用過它。將文件寫入到外部SD卡上的位置,修改代碼,如下所示:

FileOutputStream fOut = null; 
//Since you are creating a subdirectory, you need to make sure it's there first 
File directory = new File(Environment.getExternalStorageDirectory(), "AutoWriter"); 
if (!directory.exists()) { 
    directory.mkdirs(); 
} 

try { 
    //Create the stream pointing at the file location 
    fOut = new FileOutputStream(new File(directory, "samplefile.txt")); 
} catch (FileNotFoundException e) { 
    e.printStackTrace(); 
} 
OutputStreamWriter osw = new OutputStreamWriter(fOut); 

//...etc... 

使用SD卡允許任何人都可以訪問的文件。

+0

現在完美運作,非常感謝。 – 2013-03-05 04:07:25

2

openFileOutput()在內部寫入文件內存和不是SD卡。因此,改變

fOut = openFileOutput(sdDir + "/AutoWriter/samplefile.txt",MODE_WORLD_READABLE); 

fOut = openFileOutput("samplefile.txt", MODE_WORLD_READABLE); 

而且文件名不能包含路徑分隔符。見Android Developers Reference

公共抽象FileOutputStream中openFileOutput(字符串名稱,詮釋模式)

開放與寫作此上下文的應用程序包 關聯的私人文件。如果該文件不存在,則創建該文件。

參數名稱要打開的文件的名稱; 不能包含路徑 分隔符

該文件可以被像這樣訪問。

FileInputStream fis = openFileInput("samplefile.txt"); 

注: 對於那些體積龐大的文件,最好將其保存在SD卡。這是代碼片段。

if (Environment.MEDIA_MOUNTED.equals(Environment.getExternalStorageState())) { 
    FileOutputStream fos = null; 
    try { 
     File rootPath = new File(Environment.getExternalStorageDirectory(), "AutoWriter"); 
     if (!rootPath.exists()) 
      rootPath.mkdirs(); 

     File file = new File(rootPath, "samplefile.txt"); 
     fos = new FileOutputStream(file); 

     // ... more lines of code to write to the output stream 

    } catch (FileNotFoundException e) { 
     Toast.makeText(this, "Unable to write file on external storage", Toast.LENGTH_LONG).show(); 
    } finally { 
     if (fos != null) { 
      try { 
       fos.close(); 
      } catch (IOException e) {} 
     } 
    } 
} 
+0

這確實修復了崩潰,但是,我需要能夠將文件保存在android文件系統中的一個可輕鬆檢索的位置,以便我可以將它們添加爲電子郵件附件。 – 2013-03-05 03:45:45

+0

該文件保存在應用程序的內部文件夾中。例如。 /data/data/com.app.package/files。您可以讀取文件usinf openFileInput(「samplefile.txt」)。 – appsroxcom 2013-03-05 03:50:28

+0

如果openFileOutput無法做到,我會如何將它保存到SD卡上? – 2013-03-05 03:53:33

相關問題