Android文件写入只读文件系统警告

时间:2012-02-09 16:44:25

标签: android android-file

我正在尝试使用FileOutputStreamOutputStreamWriter编写文件,但我一直收到只读警告。

以下是我正在使用的代码

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

Logcat输出

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)

我确定问题是什么。

3 个答案:

答案 0 :(得分:7)

Dunno为什么Pratik的评论被低估了 - 他是对的,因为你希望获得写入外部存储的许可。假设你想写的地方。

Devconsole也是对的;您不能只写任何文件名,大部分文件系统都被锁定并且只读。

要写入外部存储(sdcard)中的任意位置,请使用getExternalStorageDirectory()作为外部存储的根目录。还可以使用getExternalStorageState()确认外部存储实际可用。

不要将文件放在外部存储的根目录中;将它们放在子目录中以防止根变得太杂乱。 (编辑:并且一些Android实现无论如何都不会让你这样做。)

使用getExternalFilesDir()获取外部存储空间中的位置,该位置名义上属于您的应用程序。 (API 8新增内容)

使用getFilesDir()获取/ data /下的位置,您可以在其中编写应用程序专用文件。这不是外部存储,因此空间紧张;不要在这里写大文件。

另见:

  • getDir() - 获取/ data / data / yourapname /
  • 下的目录
  • getFilesDir() - 返回目录/ data / data / yourappname / files /
  • fileList() - 列出/ data / data / yourappname中的文件 / files /
  • getFileStreamPath() - 获取/ data / data / yourappname中的文件 / files /
  • openFileInput() - 从/ data / data / yourappname / files /中打开文件以供阅读
  • openFileOutput() - 从/ data / data / yourappname / files /中打开文件进行编写
  • getCacheDir() - 返回目录/ data / data / yourappname / cache /
  • getExternalCacheDir() - 返回目录/ sdcard / Android / data / yourappname / cache /
  • DELETEFILE()

答案 1 :(得分:5)

您只能将文件写入内部存储(设备存储器)或外部存储(SD卡),请参阅http://developer.android.com/guide/topics/data/data-storage.html。只需打开一个带有任意文件名的FileOutputStream就行不通,因为该文件系统是只读的。

答案 2 :(得分:3)

只需在清单中给予许可

<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"/>