理解简单的XML解析器 - 新文件输出 - Java

时间:2012-04-18 09:29:58

标签: java android xml xml-parsing simple-framework

我正在尝试学习如何使用此线程中详述的Simple XML Framework:Best practices for parsing XML

我使用以下代码:

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();
    }
}
}

我在理解这条线时遇到了问题

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

1)这行是否在我的app中创建了一个名为example.xml的新文件?如果是这样,该文件位于何处。

2)或者这行是否会查找名为example.xml的现有文件,然后添加到该文件中?如果是这样,应该将example.xml文件放在我的应用程序包中,以便找到它。我确实注意到我收到错误消息:

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

谢谢。

4 个答案:

答案 0 :(得分:5)

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

这一行只会将文件名“example.xml”存储在新的File对象中。没有检查该文件是否确实存在,也没有尝试创建它。

未指定绝对路径的文件(以/开头,如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);

或者您可能需要自己创建目录(以hackish方式获取您的应用目录,但它应该有效):

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会更安全。

答案 1 :(得分:0)

我在Android页面上看到的内容,我看到它创建了一个具有该名称的文件:

File constructor

我认为它将它写入/ data / data / packagname 目录

编辑:'packagename'未显示在上面的tekst中。我把它放在括号之间。 :■

答案 2 :(得分:0)

2个干净利落的解决方案:

  1. 使用openFileOutput在应用程序专用目录中写入一个私有文件(如果移动应用程序,可以将其放在内部存储器或外部存储器中)。有关代码段
  2. ,请参阅here
  3. 或使用File constructor在您的应用具有写入权限的任何位置创建文件。例如,如果您想将文件存储在SDCard上。实例化文件不会在文件系统上创建它,除非你开始写它(例如FileOutputStream)
  4. 我建议使用方法1,这对用户来说更好,因为卸载应用时会删除这些文件。如果文件很大,那么使用外部存储可能会更好。

答案 3 :(得分:0)

尝试保存到/sdcard/example.xml