从没有数据库的JavaFX应用程序保存数据

时间:2016-05-07 13:20:53

标签: java database serialization javafx

不幸的是我找不到任何特定于这个主题/我的问题。我们走了:

我正在为我的一个朋友构建一个JavaFX业务应用程序。不幸的是,我没有任何可能连接到数据库。我希望应用程序从文件加载savestate。该应用程序包含一个客户端列表,客户端获得了一些特定的属性。我不想将其硬编码为.prop或.txt文件,因为我确定有不同的方法可以做到这一点,不是吗?

提前致谢,谢谢!

2 个答案:

答案 0 :(得分:1)

将数据保存到本地存储的大量选择。确切的选择取决于您的需求。您没有描述足够的细节来提出具体建议。

以下是可能性列表,大致按数据复杂程度递增顺序。

文本文件

如果您有少量简单数据,请保存到文本文件。您可以将每个部分存储在单独的文件中,也可以合并为一个文件。 Java的最新版本具有新的类,使这比以往更容易。请参阅Oracle Tutorial

逗号分隔&制表符分隔的

对于结构化数据集,请在comma-separated values (CSV)tab-delimited values中写入文本文件。例如,每个人都有行的人员列表,以及姓名,电话号码和电子邮件地址的列。

虽然读/写这些文件很容易自己编程,但我建议使用已建立的库来消除苦差事,避免错误,并节省一些时间。有一些用Java编写的这样的库。

我最喜欢的是Apache Commons CSV项目。这个库使得阅读/编写这些文件的工作变得简单。尽管名称如此,但此库还支持制表符分隔格式以及逗号分隔格式。我在Stack Overflow上写了几个答案,展示了如何使用这个库,因为你可以看到hereherehere

顺便说一下,普通的旧ASCII在数据文件中定义few character positions explicitly for delimiting,有四个级别的分组(文档,组,记录/行和字段)。 Unicode,当然是inherits these from ASCII as code points。我很困惑为什么这些仍然如此模糊,并且不经常使用。对我来说似乎比使用可能存在于数据有效负载内的逗号和制表符更合乎逻辑。

序列化

您可以写出存储在对象中的数据值。这称为序列化。 Java内置了一个序列化工具,但一定要仔细研究细节。

为了更简单地写出一个对象的值,然后再将它们读回来重构一个对象,我很高兴使用Simple XML Serialization项目。这适用于相对简单的需求,并且针对您希望类的结构驱动确定要写入的过程的情况。

Java还有其他内置和第三方的XML绑定工具。它们的灵活性要强得多。当您想要以严格的方式定义和验证XML结构时,它们尤其适用,例如定义用于验证数据的XML DTDXML Schema,甚至可能生成要在其中生成的Java类。代表数据。

嵌入式数据库

对于更复杂的数据,请使用嵌入式关系数据库。

SQLite数据库与许多平台捆绑在一起。这是一个基于C的库,而不是纯Java。正如名称所示,SQLite确实非常“精简”,缺乏严格的数据类型和许多其他常见的数据库功能。 SQLite是编写文本文件的替代方法,而不是更严肃的数据库的竞争对手。如果您的需求符合其功能的最佳点,那么它是一款出色的产品。

我对嵌入式数据库的首选是H2 Database Engine。内置纯Java。可以在您的应用程序内运行,也可以作为服务器(您选择)单独运行。具有复杂的关系数据库功能。已经存在多年,经常更新,并且是老旧的。主要作者在该领域有很多经验。

答案 1 :(得分:0)

如果你想要一个不需要像SQLite这样的外部库的解决方案,你可以使用ObjectOutputStream / ObjectInputStream。

此方法允许您使用保存到文件的java类作为数据存储区。

<强> ObjectDB.java

public class ObjectDB implements Serializable {
    private static final long serialVersionUID = 5864896800675704551L;
    private List<String> list;
    private Map<String, String> map;

    public List<String> getList() {
        return list;
    }

    public void setList(List<String> list) {
        this.list = list;
    }

    public Map<String, String> getMap() {
        return map;
    }

    public void setMap(Map<String, String> map) {
        this.map = map;
    }
}

<强> ObjectTest.java

public class ObjectTest {
    public static void main(String[] args) {
        String FILENAME = "ObjectDB";

        List<String> list = new ArrayList<>();
        list.add("Bob");
        list.add("Rick");

        Map<String, String> map = new HashMap<String, String>();
        map.put("Jane", "Rick");
        map.put("Mike", "Bob");

        ObjectDB db = new ObjectDB();
        db.setList(list);
        db.setMap(map);

        try {
            // Save Object
            try (ObjectOutputStream oos = new ObjectOutputStream(new FileOutputStream(FILENAME))) {
                oos.writeObject(db);
            }

            db = null;

            // Read Object
            try (ObjectInputStream ois = new ObjectInputStream(new FileInputStream(FILENAME))) {
                db = (ObjectDB) ois.readObject();
            }

            System.out.println(db.getList());
        } catch (Exception e) {
            e.printStackTrace();
        }
    }
}