2

I am trying to learn how to use the Simple XML Framework as detailed in this thread : Best practices for parsing XML.

I am using the following code :

public class SimpleXMLParserActivity extends Activity {
/** Called when the activity is first created. */
@Override
public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    //setContentView(R.layout.main);

    Serializer serializer = new Persister();
    Example example = new Example("Example message", 123);
    File result = new File("example.xml");

    try {
        Log.d("Start", "Starting Serializer");
        serializer.write(example, result);
    } catch (Exception e) {
        // TODO Auto-generated catch block
        Log.d("Self", "Error");
        e.printStackTrace();
    }
}
}

I am having a problem understanding the line

File result = new File("example.xml");

1) Does this line create a new file in my app called example.xml ? If so where is this file located.

2) Or does this line look for an existing file called example.xml and then add to it ? If so where should the example.xml file be placed in my app bundle so that it can be found. I do notice at the moment I am getting an error message :

java.io.FileNotFoundException: /example.xml (Read-only file system)

Thank you.

4

4 に答える 4

5
File result = new File("example.xml")

この行は、ファイル名「example.xml」を新しいFileオブジェクトに保存するだけです。そのファイルが実際に存在するかどうかはチェックされず、作成も試みられません。

/絶対パスを指定していないファイル ( likeで始まるnew File("/sdcard/example.xml")) は、現在の作業ディレクトリにあると見なされますが、これは/Android アプリ用 (-> /example.xml (Read-only file system))であると推測されます。

あなたの実際のファイルを作成しようとすると思いserializer.write(example, result);ますが、「/」に書き込めないため失敗します。

そのファイルのパスを指定する必要があります。ファイルを保存できる場所はいくつかあります。

  • Context#getFilesDir()は、アプリのホーム ディレクトリ ( /data/data/your.package/files/) 内に、追加のアクセス許可なしで、自分だけが読み書きできる場所を提供します。
  • Environment#getExternalStorageDirectory()は、一般的なプライマリ ストレージを提供します (そうかもしれませんが/sdcard/、デバイスの場合は大きく異なります)。ここに書き込むには、WRITE_EXTERNAL_STORAGEパーミッションが必要です。
  • 環境には、より専門的な場所が他にもあります。例: メディア ファイル、ダウンロード、キャッシュなど。
  • 外部ストレージに保存したいアプリのプライベート(大きな)ファイル用のContext#getExternalFilesDir()もあります(のようなもの/sdcard/Android/data/your.package/

あなたができるコードを修正するために

File result = new File(Environment.getExternalStorageDirectory(), "example.xml");

編集:提供されたメカニズムを使用して既存のディレクトリを取得します(推奨されますが、使用することになっているフォルダーに限定されます):

// via File - /data/data/your.package/app_assets/example.xml
File outputFile = new File(getDir("assets", Context.MODE_PRIVATE), "example.xml");
serializer.write(outputFile, result);

// via FileOutputStream - /data/data/your.package/files/example.xml
FileOutputStream outputStream = openFileOutput("example.xml", Context.MODE_PRIVATE);
serializer.write(outputStream, result);

または、ディレクトリを自分で作成する必要がある場合があります (アプリのディレクトリを取得するためのハックな方法ですが、動作するはずです):

File outputFile = new File(new File(getFilesDir().getParentFile(), "assets"), "example.xml");
outputFile.mkdirs();
serializer.write(outputFile, result);

"/data/data/com.simpletest.test/assets/example.xml"他のデバイス / Android バージョンでは異なる可能性があるため、などのフルパスを指定することは避けてください。である/ことを保証するものではありません/File.separatorChar必要に応じて代わりに使用する方が安全です。

于 2012-04-18T10:14:19.887 に答える
0

Androidページで読んだことは、その名前のファイルを作成していることがわかります:

ファイルコンストラクター

/data/data/ packagegnameディレクトリに書き込むと思います

編集: 'packagename' は上記のテクストに表示されませんでした。括弧の間に入れました。:s

于 2012-04-18T09:56:35.840 に答える
0

それをきれいにするための2つの解決策:

  1. openFileOutput を使用して、アプリケーションのプライベート ディレクトリにプライベート ファイルを書き込みます (アプリがそこに移動された場合は、内部メモリまたは外部ストレージに配置される可能性があります)。スニペットについては、こちらを参照してください
  2. または、File コンストラクターを使用して、アプリが書き込みアクセス権を持つ任意の場所に File を作成します。これは、たとえば SD カードにファイルを保存する場合です。ファイルへの書き込みを開始しない限り、ファイルをインスタンス化してもファイルシステム上に作成されません(たとえば、FileOutputStreamを使用)

アプリをアンインストールするとこれらのファイルが消去されるため、アプローチ 1 をお勧めします。ファイルが大きい場合は、おそらく外部ストレージを使用することをお勧めします。

于 2012-04-18T10:13:56.577 に答える
0

に保存してみてください/sdcard/example.xml

于 2012-04-18T11:32:08.150 に答える