【问题标题】:Save XML file with XStream使用 XStream 保存 XML 文件
【发布时间】:2012-10-25 07:40:01
【问题描述】:

我使用XStreamxml file 中写入一个对象。
然后我再次反序列化文件以使用对象。
我的问题是,关闭程序后,xml“文件”消失了。那么如何将这个 xml 文件保存到特定目录呢?我已经尝试过FileOutputStream,但它不起作用......我也用谷歌搜索它,但没有找到适合我的解决方案......

方法savePerson

public void savePerson(String uNummer, Person person) {
    System.out.println("save person");
    try{            
        xml = xstream.toXML(person);

    }catch (Exception e){
        System.err.println("Error in XML Write: " + e.getMessage());
    }
}

还有方法readPerson

public Person readPerson(String uNummer) {
    System.out.println("read person");
     Person person = new Person();
    try{
        person = (Person) xstream.fromXML(file_path + uNummer + ".xml");       
    }catch(Exception e){
        System.err.println("Error in XML Read: " + e.getMessage());
    }
    return person;
}

目录\\releasearea\ToolReleaseArea\PersistenceSave

编辑
正确代码:(作者 ppeterka

public void savePerson(String uNummer, Person person) {
    System.out.println("save person XML");
    FileOutputStream fos = null;
    try{            
        xml = xstream.toXML(person);
        fos = new FileOutputStream(file_path + uNummer + ".xml");
        fos.write("<?xml version=\"1.0\"?>".getBytes("UTF-8"));
        byte[] bytes = xml.getBytes("UTF-8");
        fos.write(bytes);

    }catch (Exception e){
        System.err.println("Error in XML Write: " + e.getMessage());
    }
    finally{
        if(fos != null){
            try{
                fos.close();
            }catch (IOException e) {
                e.printStackTrace();
            }
        }
    }
}

【问题讨论】:

  • 能贴出文件编写代码吗?您只将序列化发布到字符串。您说您尝试使用 FileWriter;这应该工作
  • 不,我的 FileWriter 解决方案不起作用...但是好的,我发布我尝试的代码...
  • 别打扰,ppterka 答案的代码应该可以工作
  • 刚刚编辑过 :) 现在我试试他的回答
  • ObjectOutputStream 用于java对象序列化;它与 XML 无关。实际上它将二进制数据写入输出流

标签: java xstream


【解决方案1】:

你没有写文件,只是获取了序列化的内容……

FileOutputStream fos = null;
try {
    fos = new FileOutputStream("myfilename");
    fos.write("<?xml version=\"1.0\"?>".getBytes("UTF-8")); //write XML header, as XStream doesn't do that for us
    byte[] bytes = xml.getBytes("UTF-8");
    fos.write(bytes);

} catch(Exception e) {
    e.printStackTrace(); // this obviously needs to be refined.
} finally {
    if(fos!=null) {
        try{ 
            fos.close();
        } catch (IOException e) {
            e.printStackTrace(); // this obviously needs to be refined.
        }
    }
}

另外,您的阅读功能也有错误:xstream.fromXML(String) 接受 String,但它不会将其解释为文件名,而是将其解释为 XML 内容本身...您必须使用 @987654324 @函数:

public Person readPerson(String uNummer) {
    System.out.println("read person");
    Person person = new Person(); //if there is an error during deserialization, this is going to be returned, is this what you want?
    try{
        File xmlFile = new File(file_path + uNummer + ".xml");
        person = (Person) xstream.fromXML(xmlFile);       
    }catch(Exception e){
        System.err.println("Error in XML Read: " + e.getMessage());
    }
    return person;
}

【讨论】:

  • 不要忘记添加 XML 声明,因为 XStream 省略了它。来自 Xstream FAQ :“XStream 旨在编写 XML sn-ps,因此您可以将其输出嵌入到现有流或字符串中。您可以自己将 XML 声明写入 Writer,然后再使用它调用 XStream.toXML(writer)。 "
  • 酷,它有效 :) 我为我的特定程序发布了正确的代码。但我不明白你代码中的所有内容,你能帮忙解释一下吗?那么 byte[] bytes = xml.getBytes("UTF-8"); ?真的不明白这个...
  • 那只是数据类型转换。在写入文件之前,必须将字符串转换为字节。明确指定字符编码是明智的,因为默认编码可能因系统而异。
  • 对不起,当我再次询问时,但 XStream 对我来说是全新的......现在我的方法 readPerson 不起作用。错误:在开始标记之前只允许空白内容,而不是 /(位置:START_DOCUMENT seen /... @1:1)...?
  • @dTDesign:在我的回答中,您可以找到一个新的readPerson() 函数,这会报错吗?如果是,什么样的错误?
【解决方案2】:

使用重载方法 toXML(Object o, Writer w) 直接序列化到文件。 您使用的 toXML 方法不会保存到文件中。

xstream.toXML(person, new FileWriter(file));

【讨论】:

    【解决方案3】:

    我这样做效果很好:

    //Your Stream things...
    
        String xml = xstream.toXML(type);
    
            System.out.println(xml);
    
            BufferedReader reader = new BufferedReader(new StringReader(xml));
            BufferedWriter writer = new BufferedWriter(new FileWriter("test.xml",
                    true));
    
            while ((xml = reader.readLine()) != null) {
    
                writer.write(xml + System.getProperty("line.separator"));
    
            }
    
            writer.close()
    

    ;

    输出是:

    <type>
      <OBJECT__TYPE>sdfsdf</OBJECT__TYPE>
      <prop>
        <DESCRIPTION>hfh</DESCRIPTION>
        <PARENT>NULL</PARENT>
        <VIRTUAL>0</VIRTUAL>
        <VISIBLE>1</VISIBLE>
        <PICTURE>NULL</PICTURE>
        <HELP>345345</HELP>
        <MIN__NO>NULL</MIN__NO>
        <MAX__NO>1</MAX__NO>
        <NAME__FORMAT>NULL</NAME__FORMAT>
      </prop>
    </type>
    <type>
      <OBJECT__TYPE>test</OBJECT__TYPE>
      <prop>
        <DESCRIPTION>test</DESCRIPTION>
        <PARENT>NULL</PARENT>
        <VIRTUAL>0</VIRTUAL>
        <VISIBLE>0</VISIBLE>
        <PICTURE>NULL</PICTURE>
        <HELP>noe</HELP>
        <MIN__NO>NULL</MIN__NO>
        <MAX__NO>NULL</MAX__NO>
        <NAME__FORMAT>5475</NAME__FORMAT>
      </prop>
    </type>
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2014-12-25
      • 1970-01-01
      • 2012-02-17
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-11-07
      • 2023-04-01
      相关资源
      最近更新 更多