将XML保存到相对文件位置。

时间:2013-09-09 13:20:56

标签: java xml inputstream outputstream urlconnection

我有一个writeScore.class正在执行以下操作:

  • 获取相对文件score.xml
  • 的URL和InputStream
  • 通过解析现有的
  • 开始构建新的xml文档
  • 将新记录附加到文档构建器

程序的最后一件事应该是将旧文档写入旧文档的位置。可悲的是,我找不到任何方法来使用我已经拥有的相对路径。我尝试使用URLConnection而不是.getOutputStream,但我收到了protocol doesn't support output错误。我还尝试了OIUtils.copy(is, os)将InputStream转换为OutputStream,但是虽然没有错误,但由于某种原因,文件没有改变,最后一次修改日期指向我最后一次使用直接文件地址。 (我做了系统范围的搜索,以防在其他地方创建新文件,什么都没找到。)

以下是使用URLConnection方法的简化代码:

public class writeScore {

public writeScore(Score NewScore, Interface obj) {
    try {

        // prepare file path
        URL scoreUrl = new URL("file","localhost","save/score.xml");
        InputStream is = scoreUrl.openStream();
        final URLConnection scoreCon = scoreUrl.openConnection();
        final OutputStream os = scoreCon.getOutputStream();

        // build the document
        DocumentBuilderFactory docFactory = DocumentBuilderFactory.newInstance();
        DocumentBuilder docBuilder = docFactory.newDocumentBuilder();
        Document doc = docBuilder.parse(is);

        // root element
        Element root = doc.getDocumentElement();
        Element rootElement = doc.getDocumentElement();

        // add new save
        /* removed for code cleaning */

        // save source
        DOMSource source = new DOMSource(doc);

        // set up the transformer
        TransformerFactory transformerFactory = TransformerFactory.newInstance();
        Transformer transformer = transformerFactory.newTransformer();

        // add properties of the output file
        transformer.setOutputProperty(OutputKeys.INDENT, "yes");
        transformer.setOutputProperty("{http://xml.apache.org/xslt}indent-amount", "2");

        // save the file
        StreamResult result = new StreamResult(os);

        transformer.transform(source, result);

    } // and catch all the exceptions
}
}

如果需要,我也很乐意改变输入文件的方式,只要我有一条从Java/bin/game/writeScore.classJava/save/score.xml的相对路径,其中'Java'是我的项目目录。但是一旦游戏打包成.jar,save就是那个jar之外的文件夹。

1 个答案:

答案 0 :(得分:1)

只需使用在当前工作目录中创建文件的new File("name")即可。使用new File("../name"),您可以在父目录中创建一个文件。然后,您需要将文件包装在FileOutputStream

但我会建议使用JAXB.unmarshal(file, clazz)进行阅读,JAXB.marshal(object, file)进行写作。只需删除旧文件,然后再编写新文件。我从未遇到过更新resp的麻烦。覆盖。

我是这样做的,我删除了异常处理和日志记录。非常简洁和通用。

public static <T> void writeXml(T obj, File f)
  {
      JAXB.marshal(obj, f);
  }