是否可以在Java中将对象存储到属性文件中?

时间:2016-06-13 17:33:50

标签: java file object text

今天我尝试使用Object存储java.util.properties。我看到许多示例只使用StringInteger。这是一个例子:

public static void main(String[] args) {
    Properties prop = new Properties();

    // add some properties
    prop.setProperty("Height", "200");
    prop.put("Width", "1500");

    // print the list 
    System.out.println("" + prop);
    try {
        // store the properties list in an output stream
        prop.store(System.out, "config.properties");
    } catch (IOException ex) {
        ex.printStackTrace();
    }
}

那么可以在Object文件或properties文件中存储xml吗?

2 个答案:

答案 0 :(得分:3)

要存储对象,首先应将其序列化为字节数组,然后使用Base64 encoder对其进行编码:

public static String toString(Object o) throws IOException {
    try (ByteArrayOutputStream baos = new ByteArrayOutputStream();
            ObjectOutputStream oos = new ObjectOutputStream(baos);) {
        oos.writeObject(o);
        return new String(Base64Coder.encode(baos.toByteArray()));
    }
}

然后您可以将其安全地存储到属性文件中:

prop.put("object.instance", toString(o));

要从属性中读取对象,请使用以下函数:

public static Object fromString(String s) throws IOException, ClassNotFoundException {
    byte[] data = Base64Coder.decode(s);
    Object o;
    try (ObjectInputStream ois = new ObjectInputStream(
            new ByteArrayInputStream(data))) {
        o = ois.readObject();
    }
    return o;
}

您可以从字符串中反序列化对象:

Object o = fromString(prop.get("object.instance"));

答案 1 :(得分:2)

否,因为Javadoc声明:

  

如果在“受损”属性上调用商店保存方法   对象包含非String键或值,调用将失败。

如果您确实需要将对象存储到Properties中,则可以将其转换为JSON,因为它是一种人类可读的众所周知的格式,如果有人添加了错误的字符中间你仍然可以解决它。

以下是使用ObjectMapper

执行此操作的方法
Properties prop = new Properties();

ObjectMapper mapper = new ObjectMapper();
// Convert my object foo into JSON format and put it into my Properties object
prop.put("myObj",  mapper.writeValueAsString(foo));

StringWriter output = new StringWriter();
// Store my properties
prop.store(output, null);

prop = new Properties();
// Load my properties
prop.load(new StringReader(output.toString()));

// Parse my object foo from the value of my new Properties object
Foo foo2 = mapper.readValue(prop.getProperty("myObj"), Foo.class);

Here是一个很好的教程,解释了如何在更多细节中使用ObjectMapper