2012-01-19 2 views
1

Я пытаюсь записать файл на внешнее хранилище в android. Я продолжаю получать ошибку ", java.io.FileNotFoundException: /mnt/sdcard/Survey.txt (это каталог)." Метод, который содержит код для этого заключается в следующем:Запись на внешнее хранилище filenotfoundexception

public String sendFile(System system) throws FileNotFoundException { 

    File writeable = new File(Environment.getExternalStorageDirectory() 
      .getAbsolutePath() + "/Survey.txt"); 
    try { 
     writeable.createNewFile(); 
    } catch (IOException e1) { 
     // TODO Auto-generated catch block 
     e1.printStackTrace(); 
    } 

    try { 

     Log.w("Before FO", "***"); 
     if (!Environment.getExternalStorageState().equals(
       Environment.MEDIA_MOUNTED)) { 
      Toast.makeText(context, "External SD card not mounted", 
        Toast.LENGTH_LONG).show(); 
     } else { 
      FileOutputStream f = new FileOutputStream(writeable); 
      Log.w("before write", "0"); 

      f.write("HELLOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOO".getBytes()); 
      Log.w("before write", "1"); 
      f.close(); 
     } 
    } catch (Exception e) { 
     Log.w("Write sd", e.toString()); 
    } 

    return writeable.getAbsolutePath(); 
} 

Я считаю, что программа разбивающихся о замедлении FileOutputStream, потому что Log.w («Перед FO», «*»); выполняет. Я искал ответ на эту проблему в течение нескольких дней, поэтому любая помощь будет принята с благодарностью. Благодаря!

01-19 14:07:33.839: W/Before FO(641): *** 
01-19 14:07:33.857: W/Write sd(641): java.io.FileNotFoundException: /mnt/sdcard/Survey.txt (Is a directory) 
01-19 14:07:33.857: W/Write sd(641): at org.apache.harmony.luni.platform.OSFileSystem.open(Native Method) 
01-19 14:07:33.857: W/Write sd(641): at dalvik.system.BlockGuard$WrappedFileSystem.open(BlockGuard.java:239) 
01-19 14:07:33.857: W/Write sd(641): at java.io.FileOutputStream.<init>(FileOutputStream.java:101) 
01-19 14:07:33.857: W/Write sd(641): at java.io.FileOutputStream.<init>(FileOutputStream.java:77) 
01-19 14:07:33.857: W/Write sd(641): at premise.survey.IOInterface.sendFile(IOInterface.java:315) 
01-19 14:07:33.857: W/Write sd(641): at premise.survey.PremiseSurveyActivity.onClick(PremiseSurveyActivity.java:1119) 
01-19 14:07:33.857: W/Write sd(641): at android.view.View.performClick(View.java:3110) 
01-19 14:07:33.857: W/Write sd(641): at android.view.View$PerformClick.run(View.java:11934) 
01-19 14:07:33.857: W/Write sd(641): at android.os.Handler.handleCallback(Handler.java:587) 
01-19 14:07:33.857: W/Write sd(641): at android.os.Handler.dispatchMessage(Handler.java:92) 
01-19 14:07:33.857: W/Write sd(641): at android.os.Looper.loop(Looper.java:132) 
01-19 14:07:33.857: W/Write sd(641): at android.app.ActivityThread.main(ActivityThread.java:4123) 
01-19 14:07:33.857: W/Write sd(641): at java.lang.reflect.Method.invokeNative(Native Method) 
01-19 14:07:33.857: W/Write sd(641): at java.lang.reflect.Method.invoke(Method.java:491) 
01-19 14:07:33.857: W/Write sd(641): at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:841) 
01-19 14:07:33.857: W/Write sd(641): at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:599) 
01-19 14:07:33.857: W/Write sd(641): at dalvik.system.NativeStart.main(Native Method) 
01-19 14:07:33.857: I/ActivityManager(73): Starting: Intent { act=android.intent.action.CHOOSER cmp=android/com.android.internal.app.ChooserActivity (has extras) } from pid 641 
01-19 14:07:33.857: W/WindowManager(73): Failure taking screenshot for (230x341) to layer 21020 
01-19 14:07:34.027: I/ActivityManager(73): Starting: Intent { act=android.intent.action.SEND typ=plain/text flg=0x3000000 cmp=com.android.email/.activity.MessageCompose (has extras) } from pid 641 
01-19 14:07:35.269: I/ActivityManager(73): Displayed com.android.email/.activity.MessageCompose: +1s197ms (total +1s391ms) 
01-19 14:07:40.647: D/dalvikvm(252): GC_EXPLICIT freed 164K, 5% free 7462K/7815K, paused 4ms+3ms 
01-19 14:07:45.727: D/dalvikvm(269): GC_EXPLICIT freed 8K, 8% free 6305K/6791K, paused 13ms+5ms 
01-19 14:12:04.720: D/SntpClient(73): request time failed: java.net.SocketException: Address family not supported by protocol 
01-19 14:12:15.947: I/Email(293): ReconcilePopImapAccountsSync: start 
01-19 14:12:15.977: I/Email(293): ReconcilePopImapAccountsSync: done 
01-19 14:12:16.137: D/dalvikvm(293): GC_CONCURRENT freed 236K, 8% free 7787K/8391K, paused 4ms+7ms 
01-19 14:12:16.137: W/CursorWrapperInner(293): Cursor finalized without prior close() 


Line 315 in IOInterface.java is FileOutputStream f = new FileOutputStream(writeable); 
+1

Пожалуйста, авторизуйтесь ваш исключение с использованием другого кода: 'Log.w (« Write sd », e);' (no 'toString()' для исключения) и отправить трассировку стека из logcat. Кроме того, вы можете создать свой объект File с помощью этого синтаксиса: «Файл writeable = new File (Environment.getExternalStorageDirectory(),« Survey.txt »);' –

ответ

2

После этого еще несколько часов исследований по этой теме, я нашел место, были еще один человек отправил другой способ сделать это, и это выглядит следующим образом:

String fileName = surveyName + ".csv"; 
String headings = "Hello, world!"; 
File path = Environment.getExternalStorageDirectory(); 
File file = new File(path, fileName); 
path.mkdirs(); 
OutputStream os = new FileOutputStream(file); 
os.write(headings.getBytes()); 
1

Вы можете обнаружить, что файл, который вы пытаетесь записать, на самом деле является каталогом. Найдите файл/каталог и удалите его.

Я столкнулся с этим, когда я впервые работал с файлами. Я вызвал File.mkdirs(), ожидая, что он просто создаст каталоги, но создал каталог с указанным именем файла.

Когда я создаю файлы, я использую два объекта File. Первый ссылается только на путь, и я называю mkdirs(). Затем второй ссылается на файл.

//create path 
File directoryFile = new File(Environment.getExternalStorageDirectory(), ""); 
directoryFile.mkdirs(); 

//create file 
File outFile = new File(Environment.getExternalStorageDirectory(), filename); 
Смежные вопросы