2

我正在尝试学习如何使用此线程中详细介绍的简单 XML 框架:解析 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) 这一行是否在我的应用程序中创建了一个名为 example.xml 的新文件?如果是这样,该文件位于何处。

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

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

谢谢你。

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/ packagname目录

编辑:上面的 tekst 中没有显示“包名”。我把它放在括号之间。:秒

于 2012-04-18T09:56:35.840 回答
0

2个干净的解决方案:

  1. 使用 openFileOutput 在应用程序私有目录中写入一个私有文件(如果应用程序移到那里,它可以位于内部存储器或外部存储中)。看到这里的一个片段
  2. 或使用File 构造函数在您的应用程序具有写入权限的任何位置创建文件。例如,如果您想将文件存储在 SDCard 上。实例化文件不会在文件系统上创建它,除非您开始对其进行写入(例如使用 FileOutputStream)

我推荐方法 1,它对用户更好,因为当您的应用程序被卸载时,这些文件会被删除。如果文件很大,那么使用外部存储可能会更好。

于 2012-04-18T10:13:56.577 回答
0

尝试保存到/sdcard/example.xml.

于 2012-04-18T11:32:08.150 回答