我有一个writeScore.class
正在执行以下操作:
score.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.class
到Java/save/score.xml
的相对路径,其中'Java'是我的项目目录。但是一旦游戏打包成.jar,save
就是那个jar之外的文件夹。
答案 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);
}