При попытке записать файл на sdcard я получаю исключение java.io.FileNotFoundException: /filename (Read-only file system)
. К сожалению, ни одно из многочисленных решений, опубликованных здесь, не помогло мне. Я установил разрешения, а внешнее хранилище находится в состоянии MEDIA_MOUNTED. Это проблемный код:
Log.i("STORAGE", Environment.getExternalStorageState()); OutputStream fos = new FileOutputStream(Helpers.StripExtension(filePath) + ".blk"); fos.write(digest.getBytes()); fos.close();
filePath
поступает из тикера файла. То, что я пытаюсь сделать, это чтение из выбранного файла, а затем сохранение другого файла с тем же именем, другим расширением и некоторыми вещами в нем.
Manifest:
<manifest xmlns:android="http://schemas.android.com/apk/res/android" package="mypackagename" android:versionCode="1" android:versionName="1.0" > <uses-sdk android:minSdkVersion="10" android:targetSdkVersion="15" /> <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" /> <uses-permission android:name="android.permission.MOUNT_UNMOUNT_FILESYSTEMS" /> <application android:icon="@drawable/ic_launcher" android:label="@string/app_name" android:theme="@style/AppTheme" > <activity android:name=".MainActivity" android:label="@string/title_activity_main" android:theme="@android:style/Theme.Black" > <intent-filter> <action android:name="android.intent.action.MAIN" /> <category android:name="android.intent.category.LAUNCHER" /> </intent-filter> </activity> </application>
Logcat:
10-25 18:24:34.330: I/FILEPATH(1989): /mnt/sdcard/Untitled.txt 10-25 18:24:34.360: I/STORAGE(1989): mounted 10-25 18:24:34.360: W/System.err(1989): java.io.FileNotFoundException: /mnt/sdcard/Untitled.blk (Read-only file system) 10-25 18:24:34.360: W/System.err(1989): at org.apache.harmony.luni.platform.OSFileSystem.open(Native Method) 10-25 18:24:34.360: W/System.err(1989): at dalvik.system.BlockGuard$WrappedFileSystem.open(BlockGuard.java:232) 10-25 18:24:34.360: W/System.err(1989): at java.io.FileOutputStream.<init>(FileOutputStream.java:94) 10-25 18:24:34.360: W/System.err(1989): at java.io.FileOutputStream.<init>(FileOutputStream.java:165) 10-25 18:24:34.360: W/System.err(1989): at java.io.FileOutputStream.<init>(FileOutputStream.java:144)
Я запускаю это на реальном устройстве, а не avd. Я попытался перезагрузить мое устройство и перестроить проект. Такие приложения, как OfficeSuite, могут без проблем записывать в это место.
Устройство: ZTE Blade с Android 2.3.7 (CyanogenMod 7)
Попробуй это:
File file = new File(Helpers.StripExtension(filePath) + ".blk"); file.createNewFile(); FileOutputStream fos = new FileOutputStream(file); fos.write(digest.getBytes()); fos.close();
И если это не сработает, я думаю, что у вас может возникнуть проблема при чтении из исходного файла ( digest.getBytes()
). Опубликуйте немного больше кода, и мы можем пойти оттуда
Редактировать:
Если это не позволяет вам писать в выбранный каталог, попробуйте протестировать путь следующим образом:
File file = new File(Environment.getExternalStorageDirectory() + "test_file.blk");
Он должен работать нормально, и вы, вероятно, просто не имеете права на запись в каталог, который используете.
Попробуй это:
File file = new File(filePath); File parent = file.getParentFile(); if (!parent.exists() && !parent.mkdirs()) { return; } file = new File(Helpers.StripExtension(filePath) + ".blk"); OutputStream fos = new FileOutputStream(file); fos.write(digest.getBytes()); fos.close();
Отлично, у меня была такая же проблема некоторое время назад. Ограничитель маршрута (или то, что он называется) отсутствует.
File file = new File(Environment.getExternalStorageDirectory() + "test_file.blk");
Не работает, но
File file = new File(Environment.getExternalStorageDirectory() + "/test_file.blk");
Хорошо работает
Также:
FileWriter f = new FileWriter(Environment.getExternalStorageDirectory().getPath()+ "/foobar"); f.append("stuff"); f.close();
Прекрасно работает.
Я думаю, что исключения говорят, что это только чтение, потому что корневая файловая система действительно действительно.
ЗАМЕТКА:
java.io.FileNotFoundException: /foobar (Read-only file system)
означает, что мы пишем системный корень
java.io.FileNotFoundException: /mnt/sdcard/foobar (Read-only file system)
означает sdcard root (я не получил это исключение, это просто пример)
Tl; dr неправильный путь