Android文件写入只读文件系统警告
问题描述:
我正在尝试使用FileOutputStream
和OutputStreamWriter
写入文件,但我不断收到只读警告。Android文件写入只读文件系统警告
这里是我使用
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)
我柔夷花序确定是什么问题真的。
答
您只能将文件写入内部存储器(设备存储器)或外部存储器(SD卡),请参阅http://developer.android.com/guide/topics/data/data-storage.html。使用任意文件名简单地打开FileOutputStream将不起作用,因为该文件系统是只读的。
答
只是给许可清单中
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"/>
答
说不上为什么PRATIK的评论被downvoted - 他是对的,你要允许写入到外部存储器。假设这是你想写的地方。
Devconsole也是对的;你不能只写任何任意的文件名,大部分文件系统被锁定并且只读。
要写入外部存储(sdcard)中的任意位置,请使用getExternalStorageDirectory()作为外部存储的根目录。也可以使用getExternalStorageState()来确认外部存储器是否可用。
请勿将文件放置在外部存储器的根目录下;将它们放置在一个子目录中以防止根变得过于混乱。 (编辑:和一些Android实现不会让你这样做。)
使用getExternalFilesDir()在外部存储中获得名义上私有的位置。 (新的API 8)
使用getFilesDir()获得下/数据/在那里你可以编写应用程序私有文件的位置。这不是外部存储,因此空间紧张;不要在这里写大文件。
参见:
- GETDIR() - 获取下/数据/数据/ yourapname/
- getFilesDir(目录) - 返回目录/数据/数据/ yourappname /文件/
- 的fileList() - 列出文件/数据/数据/ yourappname /文件/
- getFileStreamPath() - 在/数据/数据获取文件/ yourappname /文件/
- openFileInput() - 打开一个文件从/数据/数据/ yourappname内 /文件/读取
- openFileOutput() - 从内部打开文件/数据/数据/ yourappname /文件/写
- getCacheDir() - 返回目录/数据/数据/ yourappname /缓存/
- getExternalCacheDir() - 返回目录/ SD卡/安卓/数据/ yourappname/cache/
- deleteFile()
您是否在Android Manifest中为此设置了用户权限? – ihrupin 2012-02-09 16:49:02