【问题标题】:Understanding Simple XML Parser - New File Output - Java了解简单 XML 解析器 - 新文件输出 - Java
【发布时间】:2012-04-29 16:47:27
【问题描述】:

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

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

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

谢谢。

【问题讨论】:

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


    【解决方案1】:

    尝试保存到/sdcard/example.xml

    【讨论】:

      【解决方案2】:
      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 权限。
      • Environment 中有更多可用的地方更专业。例如。用于媒体文件、下载、缓存等。
      • 还有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 会更安全。

      【讨论】:

      • 谢谢。我已将代码更改为: File result = new File("/data/data/com.simpletest.test/assets/example.xml");但是我现在收到一个找不到文件的错误?
      • 查看答案中的编辑。您可能需要先创建assets 文件夹或使用其他(更好的)方法之一。
      【解决方案3】:

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

      File constructor

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

      edit: 'packagename' 没有显示在上面的 tekst 中。我把它放在括号之间。 :s

      【讨论】:

      • 对其进行了编辑。 packagename 目录用于当前应用程序
      【解决方案4】:

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

      1. 使用 openFileOutput 在应用程序私有目录中写入一个私有文件(如果应用程序移到那里,它可能位于内部存储器或外部存储中)。有关 sn-p,请参阅 here
      2. 或使用File constructor 在您的应用具有写入权限的任何位置创建文件。例如,如果您想将文件存储在 SDCard 上。实例化文件不会在文件系统上创建它,除非您开始对其进行写入(例如使用 FileOutputStream)

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

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2017-12-07
        • 2016-03-31
        • 2012-12-16
        • 2013-12-24
        • 1970-01-01
        • 1970-01-01
        • 2011-01-07
        • 1970-01-01
        相关资源
        最近更新 更多