Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Android file writing Read-Only file system warning

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.

like image 974
Droid_Interceptor Avatar asked Feb 09 '12 16:02

Droid_Interceptor


3 Answers

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()
like image 92
Edward Falk Avatar answered Nov 17 '22 06:11

Edward Falk


You can write files only to Internal Storage (device memory) or External Storage (the SD card), see http://developer.android.com/guide/topics/data/data-storage.html. Simply opening a FileOutputStream with an arbitrary file name won't work since that file system is read-only.

like image 39
devconsole Avatar answered Nov 17 '22 06:11

devconsole


just give permission in manifest

<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"/>
like image 43
Pratik Popat Avatar answered Nov 17 '22 06:11

Pratik Popat