Java 存储这些数据的最佳方式是什么?

Java 存储这些数据的最佳方式是什么?,java,io,storage,Java,Io,Storage,我正在创建一个桌面Java应用程序,它需要存储(可能成为)相当大的数据量。我最初想出了自己的格式: id;name;value,value,value... id;name;value,value,value... 以纯文本形式存储并随机读/写。我最初的想法是使用随机存取文件;但是,在任意位置插入时,我遇到了数据被覆盖的问题 使用移动现有数据、临时存储数据、恢复数据等方法似乎是一个糟糕的解决方案,特别是因为我打算经常读/写数据,所以成本会很高。我已经读到,这是底层操作系统的限制,而不是Java

我正在创建一个桌面Java应用程序,它需要存储(可能成为)相当大的数据量。我最初想出了自己的格式:

id;name;value,value,value...
id;name;value,value,value...
以纯文本形式存储并随机读/写。我最初的想法是使用随机存取文件;但是,在任意位置插入时,我遇到了数据被覆盖的问题

使用移动现有数据、临时存储数据、恢复数据等方法似乎是一个糟糕的解决方案,特别是因为我打算经常读/写数据,所以成本会很高。我已经读到,这是底层操作系统的限制,而不是Java本身的限制


整洁地存储此类数据以便频繁访问和写入的最佳方式是什么?我想到了使用SQLite。我还考虑过为每个id/名称创建一个文件,因为每个id/名称的末尾只会附加数据值,因此不会覆盖任何内容。

我会尝试使用数据库。创建数据库是为了存储数据。它们非常容易使用,而且非常简单。我喜欢使用MySQL。这对数据库非常有用。

我会尝试使用数据库。创建数据库是为了存储数据。它们非常容易使用,而且非常简单。我喜欢使用MySQL。这对数据库来说真的很好。

使用数据库解决这个问题很容易。您不需要完整的数据库。最好使用嵌入式数据库


使用诸如或之类的jvm嵌入式数据库很容易使用数据库来解决这个问题。您不需要完整的数据库。最好使用嵌入式数据库


使用jvm嵌入式数据库,例如or

使用数据库将是最受建议的方法。我将向您展示一种可选的方式,以防您或未来的读者希望轻松存储中等大小的数据,以便进行非常快速的访问。根据需要调整异常处理

public class PersistentMap extends HashMap<String, Object> implements Serializable {
    private static final long serialVersionUID = 0x42424242;
    private File file;
    protected PersistentMap(File file) throws Exception {
        this.file = file;
        if (file==null || file.isDirectory() ) {
            throw new RuntimeException("ProgramCheck: "+file);
        }
        if (!file.exists()) {
            if (file.getParent()!=null) {
                new File(file.getParent()).mkdirs();
            }
            save();
        }
        restore();
    }
    public void save() throws Exception {
        FileOutputStream fos = new FileOutputStream(file);
        ObjectOutputStream oos = new ObjectOutputStream(fos);
        oos.writeObject(this);
        oos.close();
        fos.close();
    }
    public void restore() throws Exception {
        FileInputStream fis = new FileInputStream(file);
        ObjectInputStream ois = new ObjectInputStream(fis);
        super.putAll((Map<String,Object>)ois.readObject());
        ois.close();
        fis.close();
    }
}
输出第一次运行:

 {}
 {yoyo=mama}
输出第n次运行:

 {yoyo=mama}
 {yoyo=mama}

使用数据库将是最受欢迎的方法。我将向您展示一种可选的方式,以防您或未来的读者希望轻松存储中等大小的数据,以便进行非常快速的访问。根据需要调整异常处理

public class PersistentMap extends HashMap<String, Object> implements Serializable {
    private static final long serialVersionUID = 0x42424242;
    private File file;
    protected PersistentMap(File file) throws Exception {
        this.file = file;
        if (file==null || file.isDirectory() ) {
            throw new RuntimeException("ProgramCheck: "+file);
        }
        if (!file.exists()) {
            if (file.getParent()!=null) {
                new File(file.getParent()).mkdirs();
            }
            save();
        }
        restore();
    }
    public void save() throws Exception {
        FileOutputStream fos = new FileOutputStream(file);
        ObjectOutputStream oos = new ObjectOutputStream(fos);
        oos.writeObject(this);
        oos.close();
        fos.close();
    }
    public void restore() throws Exception {
        FileInputStream fis = new FileInputStream(file);
        ObjectInputStream ois = new ObjectInputStream(fis);
        super.putAll((Map<String,Object>)ois.readObject());
        ois.close();
        fis.close();
    }
}
输出第一次运行:

 {}
 {yoyo=mama}
输出第n次运行:

 {yoyo=mama}
 {yoyo=mama}

这就是数据库的用途。尝试处理文件读取/写入将非常缓慢,如果需要搜索文件,您将获得巨大的性能影响。如果您将这些存储在数据库中,您可以通过id/名称进行访问,而不必担心文件访问。如果不了解更多关于数据的信息(是关系型的?平面型的?只有且永远是键/值的?有多少数据?需要如何搜索?等等),就很难提供有意义的建议。此时看起来更像一个键/值数据库,而不是文件。这就是创建数据库的目的。尝试处理文件读取/写入将非常缓慢,如果需要搜索文件,您将获得巨大的性能影响。如果您将这些存储在数据库中,您可以通过id/名称进行访问,而不必担心文件访问。如果不了解更多关于数据的信息(是关系型的?平面型的?只有且永远是键/值的?有多少数据?需要如何搜索?等等),就很难提供有意义的建议。在这一点上,看起来更像一个键/值数据库而不是文件。这是我想到的想法,这就是为什么我想到SQLite,所以它是自包含的。我来看看,谢谢:)@c24w、imho、apachederby或hsqldb更适合java。还有,这就是我想到的想法,这就是为什么我想到SQLite,所以它是自包含的。我来看看,谢谢:)@c24w、imho、apachederby或hsqldb更适合java。另外,请参见感谢您的贡献。我以前也做过类似的事情,但对于不需要频繁读/写的数据-在添加了许多小数据后调用save(以防止数据丢失)会不会很昂贵?就CPU%或文件I/O而言,我认为影响最小。真正的成功在于所有数据都在内存中(这就是为什么它如此之快)。添加一个JVM关闭钩子来进行最终保存,您将需要更少的检查点保存。感谢您的贡献。我以前也做过类似的事情,但对于不需要频繁读/写的数据-在添加了许多小数据后调用save(以防止数据丢失)会不会很昂贵?就CPU%或文件I/O而言,我认为影响最小。真正的成功在于所有数据都在内存中(这就是为什么它如此之快)。添加一个JVM关闭钩子来进行最终保存,您将需要更少的检查点保存。在桌面环境中,对于这样一个相对简单的模式来说,独立的MySQL几乎肯定太重了(最好使用@ring bearer这样的嵌入式DB)。根据最初的问题,他已经在考虑数据库(SQLite)。在桌面环境中,对于这样一个相对简单的模式来说,单机版MySQL几乎肯定太重了(最好使用@ring bearer之类的嵌入式DB)。