Предупреждение файловой системы только для чтения в файле Android

Я пытаюсь записать файл, используя FileOutputStream и OutputStreamWriter, но постоянно получаю предупреждение только для чтения.

Вот код, который я использую

FileOutputStream fw = new FileOutputStream((trackName.replaceAll(" ", ""))+".gpx", true);
    OutputStreamWriter osw = new OutputStreamWriter(fw);
    osw.write(XML_HEADER+"\n");
    osw.write(TAG_GPX+"\n");


    writeTrackPoints(trackName, osw, locations, time, trackDescp);
    writeWayPoints(osw, locations,time);
    osw.flush();
    osw.close();

И Logcatoutput

java.io.FileNotFoundException: /test.gpx (Read-only file system)
at org.apache.harmony.luni.platform.OSFileSystem.openImpl(Native Method)
at org.apache.harmony.luni.platform.OSFileSystem.open(OSFileSystem.java:152)
at java.io.FileOutputStream.<init>(FileOutputStream.java:97)
at java.io.FileOutputStream.<init>(FileOutputStream.java:168)
at java.io.FileOutputStream.<init>(FileOutputStream.java:147)
at com.fyp.run_race.GPXFileWriter.<init>(GPXFileWriter.java:25)
at com.fyp.run_race.GPSTrackDetails$1.onClick(GPSTrackDetails.java:58)
at android.view.View.performClick(View.java:2408)
at android.view.View$PerformClick.run(View.java:8816)
at android.os.Handler.handleCallback(Handler.java:587)
at android.os.Handler.dispatchMessage(Handler.java:92)
at android.os.Looper.loop(Looper.java:123)
at android.app.ActivityThread.main(ActivityThread.java:4627)
at java.lang.reflect.Method.invokeNative(Native Method)
at java.lang.reflect.Method.invoke(Method.java:521)
at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:868)
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:626)
at dalvik.system.NativeStart.main(Native Method)

Я уверен, в чем проблема на самом деле.


person Droid_Interceptor    schedule 09.02.2012    source источник
comment
Вы устанавливаете разрешение пользователя для этого в манифесте Android?   -  person ihrupin    schedule 09.02.2012


Ответы (3)


Вы можете записывать файлы только во внутреннюю память (память устройства) или во внешнюю память (SD-карта), см. http://developer.android.com/guide/topics/data/data-storage.html. Просто открыть FileOutputStream с произвольным именем файла не получится, так как эта файловая система доступна только для чтения.

person devconsole    schedule 09.02.2012

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

Devconsole тоже прав; вы не можете просто писать в любое произвольное имя файла, большая часть файловой системы заблокирована и доступна только для чтения.

Для записи в произвольное место во внешнем хранилище (sdcard) используйте getExternalStorageDirectory() для корня внешнего хранилища. Также используйте getExternalStorageState(), чтобы подтвердить, что внешний хранилище действительно доступно.

Не помещайте файлы в корень внешнего хранилища; поместите их в подкаталог, чтобы корень не стал слишком загроможденным. (Редактировать: и некоторые реализации Android все равно не позволят вам это сделать.)

Используйте getExternalFilesDir() для получить место во внешнем хранилище, которое номинально является частным для вашего приложения. (Новое в API 8)

Используйте getFilesDir(), чтобы получить местоположение под /data/, где вы можете писать личные файлы приложения. Это не на внешнем хранилище, поэтому места мало; не пишите сюда большие файлы.

Смотрите также:

  • getDir() -- Получить каталог в /data/data/ваше имя/
  • getFilesDir() -- возвращает каталог /data/data/имя_приложения/files/
  • fileList() -- Список файлов в /data/data/yourappname/files/
  • getFileStreamPath() -- Получить файл в /data/data/yourappname/files/
  • openFileInput() -- открывает файл из /data/data/yourappname/files/ для чтения
  • openFileOutput() -- открывает файл из /data/data/yourappname/files/ для записи
  • getCacheDir() -- возвращает каталог /data/data/имя_приложения/cache/
  • getExternalCacheDir() -- возвращает каталог /sdcard/Android/data/имя_приложения/cache/
  • удалить файл()
person Edward Falk    schedule 18.04.2013

просто дайте разрешение в манифесте

<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"/>
person Pratik Popat    schedule 04.04.2012