5

我正在尝试使用FileOutputStreamand编写文件,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();

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)

我确定问题出在哪里。

4

3 回答 3

10

不知道为什么 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/
  • 删除文件()
于 2013-04-18T21:23:32.193 回答
5

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

于 2012-02-09T16:51:50.203 回答
3

只需在清单中给予许可

<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"/>
于 2012-04-04T12:40:49.700 回答