gpt4 book ai didi

java - 将 java 对象可靠地存储在文件中的最少代码

转载 作者:塔克拉玛干 更新时间:2023-11-03 03:36:45 25 4
gpt4 key购买 nike

我想在我的小型独立 Java 应用程序中存储信息。

我的要求:

  • 读写java对象(不想用SQL,也不需要查询)
  • 易于使用
  • 易于设置
  • 最小的外部依赖

因此,我想使用 jaxb 将所有信息存储在文件系统中的一个简单XML 文件 中。我的示例应用程序如下所示(将所有代码复制到名为 Application.java 的文件中并编译,没有其他要求!):

@XmlRootElement
class DataStorage {
String emailAddress;
List<String> familyMembers;
// List<Address> addresses;
}

public class Application {

private static JAXBContext jc;
private static File storageLocation = new File("data.xml");

public static void main(String[] args) throws Exception {
jc = JAXBContext.newInstance(DataStorage.class);

DataStorage dataStorage = load();

// the main application will be executed here

// data manipulation like this:
dataStorage.emailAddress = "me@example.com";
dataStorage.familyMembers.add("Mike");

save(dataStorage);
}

protected static DataStorage load() throws JAXBException {
if (storageLocation.exists()) {
StreamSource source = new StreamSource(storageLocation);
return (DataStorage) jc.createUnmarshaller().unmarshal(source);
}
return new DataStorage();
}

protected static void save(DataStorage dataStorage) throws JAXBException {
jc.createMarshaller().marshal(dataStorage, storageLocation);
}
}

我该如何克服这些缺点?

  • 多次启动应用程序可能会导致不一致:多个用户可能会在网络驱动器上运行该应用程序并遇到并发问题
  • 中止写入过程可能会导致数据损坏或丢失所有数据

最佳答案

查看您的要求:

  • 多次启动应用
  • 多个用户可以在网络驱动器上运行该应用程序
  • 防止数据损坏

我相信基于 XML 的文件系统是不够的。 如果您认为合适的关系数据库有点矫枉过正,您仍然可以选择 H2 db . 这是一个超轻量级的数据库,可以解决上述所有这些问题(即使不是完美的,但肯定比手写的 XML 数据库好得多),并且仍然非常容易设置和维护。

您可以将其配置为将您的更改保存到磁盘,可以配置为作为独立服务器运行并接受多个连接,或者也可以作为应用程序的一部分以嵌入式模式运行。

关于“你如何保存数据”部分:

如果您不想使用任何高级 ORM 库(如 Hibernate 或任何其他 JPA 实现),您仍然可以使用普通的旧 JDBC。或者至少是一些非常轻量级且易于使用的 Spring-JDBC。

“你存什么”

H2 是一个关系型数据库。因此,无论您保存什么,它最终都会出现在列中。但!如果您真的不打算查询您的数据(既不对其应用迁移脚本),保存您已经被 XML 序列化的对象 是一个选项。您可以轻松地定义一个带有 ID + 一个“数据”varchar 列的表,并将您的 xml 保存在那里。 H2DB 中数据长度没有限制。

注意:在关系数据库中保存 XML 通常不是一个好主意。我只是建议您评估此选项,因为您似乎确信您只需要 SQL 实现可以提供的一组特定功能。

关于java - 将 java 对象可靠地存储在文件中的最少代码,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35479181/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com