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

Dro*_*tor 5 android android-file

我正在尝试使用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();
Run Code Online (Sandbox Code Playgroud)

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)
Run Code Online (Sandbox Code Playgroud)

我确定问题是什么.

Edw*_*alk 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 /
  • 删除文件()


dev*_*ole 5

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