FileNotFoundException + Запись файла на SD-карту

Я пытаюсь скачать файл из сети и записать его на SD-карту. У меня включено разрешение WRITE_EXTERNAL_STORAGE. Код здесь не работает:

OutputStream output = new FileOutputStream(filePath);

09-15 19:40:31.630: WARN/System.err(7933): java.io.FileNotFoundException: /sdcard/artoo/Customerv08.apk
09-15 19:40:31.630: WARN/System.err(7933):     at org.apache.harmony.luni.platform.OSFileSystem.open(OSFileSystem.java:231)
09-15 19:40:31.630: WARN/System.err(7933):     at java.io.FileOutputStream.<init>(FileOutputStream.java:96)
09-15 19:40:31.630: WARN/System.err(7933):     at java.io.FileOutputStream.<init>(FileOutputStream.java:169)
09-15 19:40:31.630: WARN/System.err(7933):     at java.io.FileOutputStream.<init>(FileOutputStream.java:147)
09-15 19:40:31.640: WARN/System.err(7933):     at com.artoo.settings.InstallerActivity$ProgressDialogAsyncTask.doInBackground(InstallerActivity.java:148)
09-15 19:40:31.640: WARN/System.err(7933):     at com.artoo.settings.InstallerActivity$ProgressDialogAsyncTask.doInBackground(InstallerActivity.java:1)
09-15 19:40:31.640: WARN/System.err(7933):     at android.os.AsyncTask$2.call(AsyncTask.java:185)
09-15 19:40:31.640: WARN/System.err(7933):     at java.util.concurrent.FutureTask$Sync.innerRun(FutureTask.java:256)
09-15 19:40:31.640: WARN/System.err(7933):     at java.util.concurrent.FutureTask.run(FutureTask.java:122)
09-15 19:40:31.640: WARN/System.err(7933):     at java.util.concurrent.ThreadPoolExecutor$Worker.runTask(ThreadPoolExecutor.java:648)
09-15 19:40:31.640: WARN/System.err(7933):     at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:673)
09-15 19:40:31.651: WARN/System.err(7933):     at java.lang.Thread.run(Thread.java:1060)
09-15 19:40:31.670: WARN/InputManagerService(53): Window already focused, ignoring focus gain of: com.android.internal.view.IInputMethodClient$Stub$Proxy@43868480

Я пытаюсь записать файл, и он не существует раньше. Есть идеи, как это сделать?


person Sameer Segal    schedule 15.09.2010    source источник
comment
существует ли каталог artoo?   -  person NG.    schedule 15.09.2010
comment
Вы проверили свою SD-карту и файл (через проводник/браузер)? Вы уверены, что файла нет?   -  person WarrenFaith    schedule 15.09.2010
comment
вы используете Environment.getExternalStorageDirectory() для получения корня внешнего хранилища?   -  person CommonsWare    schedule 15.09.2010
comment
@ Все, извините за путаницу. Файла не существовало, и я думал, что OutputStream позаботится об этом напрямую. Мне пришлось создать filePath и файл перед использованием OutputStream   -  person Sameer Segal    schedule 16.09.2010


Ответы (2)


Вы получаете эту ошибку, потому что указанный файл не может быть открыт или не существует. Это просто.

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

File file = new File(path, name);
file.createNewFile();
BufferedOutputStream out = new BufferedOutputStream(new FileOutputStream(file), BUFFER);
person Milan    schedule 15.09.2010
comment
Кроме того, мне также пришлось создать путь: file_path.mkdirs() - person Sameer Segal; 16.09.2010
comment
Предполагается, что FileOutputStream создаст файл, если он не существует. Конечно, он не должен создавать родительские папки, но, тем не менее, файл должен быть создан: Создает новый поток FileOutputStream, который записывает в путь. Файл будет усечен, если он существует, и создан, если он не существует. developer.android.com/reference/ java/io/. Так это баг! - person Snicolas; 21.02.2012

проверь свое разрешение в файле манифеста, парень,

дайте вашему приложению разрешение WRITE_EXTERNAL_STORAGE

person wolf    schedule 14.06.2013
comment
Это полезно для меня, я забыл добавить это разрешение в AndroidManifest.xml - person wangzhengyi; 25.11.2014