在文件中存储大量对象的最佳方法是什么?

时间:2019-07-15 18:11:05

标签: java java-ee serialization deserialization

我有一个应用程序,该应用程序有时可以在list中添加成千上万个对象(存储在内存中并导致内存不足)。

我想serialize放置文件中的对象,而不是将其添加到list中,然后在需要时反序列化。但问题是,此列表由许多查询填充。而且我不想将其保留在内存中。相反,我想继续将对象附加到文件中。

然后在写入时,我想从文件中读取它。最佳方法是什么?

2 个答案:

答案 0 :(得分:0)

考虑到您对提出的问题的答复, 您可以使用像Jackson一样的Json序列化器。将数据转换为Json对象列表并将其保存到文件。

但是像这里的其他人已经说过的那样, 不推荐。

您需要使用数据库。

答案 1 :(得分:0)

我没有使用数据库。而是使用File.createTempFile生成文件。

这是示例代码:

public class SerializeJavaDemo {
    // Just to generate some random strings
    private static final String AB = "0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz";
    private static SecureRandom rnd = new SecureRandom();

    public static void main(String[] args) {
        SerializeJavaDemo sd = new SerializeJavaDemo();
        String prefix = "test";
        String suffix = "temp";
        File directory = new File("serialize");

        // Serialize and then read    
        try {
            File file = File.createTempFile(prefix, suffix, directory);

            FileOutputStream fos = new FileOutputStream(file);
            ObjectOutputStream output = new ObjectOutputStream(fos);
            List<TestClass> list = sd.createListOfTestClasses();

            for (TestClass test : list) {
                output.writeObject(test);
            }

            output.close();
            fos.close();

            FileInputStream fis = new FileInputStream(file);
            ObjectInputStream ois = new ObjectInputStream(fis);
            Object obj = null;

            int count = 0;
            while (true) {
                try {
                    obj = ois.readObject();
                    if (obj == null) {
                        break;
                    }
                    if (obj instanceof TestClass) {
                        count++;
                        System.out.println(count + "." + ((TestClass) obj).toString());
                    }
                } catch (Exception e) {
                    break;
                }
            }
            ois.close();
            fis.close();
            file.deleteOnExit();

        } catch (IOException e) {
            e.printStackTrace();
        }
    }

    public List<TestClass> createListOfTestClasses() {
        List<TestClass> list = new ArrayList<>();

        for (int i = 0; i < 100; i++) {
            String name = randomString(10);
            Random r = new Random();
            Integer id = r.nextInt();
            TestClass test = new TestClass(id, name);
            list.add(test);
        }
        return list;
    }

    private String randomString(int len) {
        StringBuilder sb = new StringBuilder(len);
        for (int i = 0; i < len; i++)
            sb.append(AB.charAt(rnd.nextInt(AB.length())));
        return sb.toString();
    }
}

Test类如下:

public class TestClass implements Serializable {

    /**
     * Serializable id
     */
    private static final long serialVersionUID = 5574815106264956078L;

    private int id;
    private String name;

    TestClass(int id, String name) {
        this.id = id;
        this.name = name;
    }

    public int getId() { return id; }

    public void setId(int id) { this.id = id; }

    public String getName() { return name; }

    public void setName(String name) { this.name = name; }

    @Override
    public String toString() {
        return "TestClass [id=" + id + ", name=" + name + "]";
    }
}