2012-02-09 60 views
4

我正在尝试使用FileOutputStreamOutputStreamWriter写入文件,但我不断收到只读警告。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) 

我柔夷花序确定是什么问题真的。

+0

您是否在Android Manifest中为此设置了用户权限? – ihrupin 2012-02-09 16:49:02

回答

3

只是给许可清单中

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

说不上为什么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()
相关问题