Android file writing Read-Only file system warning

Droid_Interceptor picture Droid_Interceptor · Feb 9, 2012 · Viewed 14.6k times · Source

I'm trying to write a file using the FileOutputStreamand OutputStreamWriterbut I keep getting a read only warning.

Here is the code that I am using

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();

And the Logcatoutput is

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)

I ament sure what the problem is really.

Answer

Edward Falk picture Edward Falk · Apr 18, 2013

Dunno why Pratik's comment was downvoted -- he's right in that you'll want the permission to write to external storage. Assuming that's where you want to write.

Devconsole is also right; you can't just write to any arbitrary filename, most of the file system is locked down and read-only.

To write to an arbitrary location in external storage (sdcard), use getExternalStorageDirectory() for the root of external storage. Also use getExternalStorageState() to confirm that external storage is actually available.

Don't place files in the root of external storage; place them in a subdirectory to prevent the root from becoming too cluttered. (Edit: and some Android implementations won't let you do this anyway.)

Use getExternalFilesDir() to get a location in external storage that's nominally private to your application. (New in API 8)

Use getFilesDir() to get a location under /data/ where you can write application-private files. This isn't on external storage, so space is tight; don't write big files here.

See also:

  • getDir() -- Get a directory under /data/data/yourapname/
  • getFilesDir() -- Return the directory /data/data/yourappname/files/
  • fileList() -- List the files in /data/data/yourappname/files/
  • getFileStreamPath() -- Get a file in /data/data/yourappname/files/
  • openFileInput() -- Opens a file from within /data/data/yourappname/files/ for reading
  • openFileOutput() -- Opens a file from within /data/data/yourappname/files/ for writing
  • getCacheDir() -- Return the directory /data/data/yourappname/cache/
  • getExternalCacheDir() -- Return the directory /sdcard/Android/data/yourappname/cache/
  • deleteFile()