5

を使用してファイルを書き込もうとしています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)

私は問題が本当に何であるかを確信しています。

4

3 に答える 3

10

Pratikのコメントが却下された理由はDunnoです。彼は、外部ストレージへの書き込み許可が必要になるという点で正しいです。それがあなたが書きたいところだと仮定します。

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 に答える