4

这是我打算存储在磁盘中的对象,

public class SObject {
    /**
     * 
     */
    private String value;
    private int occurences;
    private String key;

    public String getValue() {
        return value;
    }

    public void setValue(String value) {
        this.value = value;
    }

    public int getOccurences() {
        return occurences;
    }

    public void setOccurences(int occurences) {
        this.occurences = occurences;
    }

    public String getKey() {
        return key;
    }

    public void setKey(String key) {
        this.key = key;
    }
}

我正在考虑创建一个对象列表并将该列表存储到一个新类,如下所示,

public class ToDisk implements Serializable{
        List<SObject> sobj;

    public List<SObject> getSobj() {
        return sobj;
    }

    public void setSobj(List<SObject> sobj) {
        this.sobj = sobj;
    }

}

这是一种用最少的代码工作来写入数据的有效方法吗?我还发现使用序列化更容易从磁盘读取数据。因为列表的大小可能非常高(~10k+),我应该在代码的易用性和大小之间找到一个平衡点。有什么办法可以达到这种平衡吗?请让我知道是否有任何其他方法可以与序列化相比以减小的大小存储数据。我不能使用任何外部库。

4

2 回答 2

4

顺便说一句,您不需要列表包装​​器即可将许多项目写入文件,但您的项目需要可序列化。

public class SObject {
    private String value;
    private int occurences;
    private String key;
}

来写

List<SObject> list = new ArrayList<>();

ObjectOutputStream oos = new ObjectOutputStream(new FileOutputStream(fileName));
oos.writeObject(list);
oos.close();

读书

ObjectInputStream ois = new ObjectInputStream(new FileInputStream(fileName));
List<SObject> list = (List<SObject>) ois.readObject(); // cast is needed.
ois.close()

写压缩

ObjectOutputStream oos = new ObjectOutputStream(new DeflaterOutputStream(new FileOutputStream(fileName)));
oos.writeObject(list);
oos.close();

读取压缩

ObjectInputStream ois = new ObjectInputStream(new InflaterInputStream(new FileInputStream(fileName)));
List<SObject> list = (List<SObject>) ois.readObject(); // cast is needed.
ois.close()

这是一种用最少的代码工作来写入数据的有效方法吗?

您必须制作 SObject implement Serializable,仅此而已。你不能让它更短。

您可以通过制作它来提高效率,implement Externalizable但这是更多的工作。

我还发现使用序列化更容易从磁盘读取数据。

听起来是个很好的理由。

因为列表的大小可能非常高(~10k+),

除非你的琴弦真的很长,否则 10K 对我来说听起来很小。我对我的序列化/持久性库进行了测试,它可以在几秒钟内写入和读取 10,000,000 个条目。

我应该在代码的易用性和大小之间找到平衡。有什么办法可以达到这种平衡吗?

我怀疑轻松是你需要担心的。如果你想让文件更小,你可以通过用 GZIP 或 deflator/inflator 流包装文件流来压缩它。这增加了一行代码,可以使文件缩小 4 倍。

请让我知道是否有任何其他方法可以与序列化相比以减小的大小存储数据。我不能使用任何外部库。

它们都需要外部库。您可以使用 XMLEncoder 和 XMLDecoder,但这会更慢且更大。


因为我有一个问题;如果您对我的库Java Chronicle 2.x感兴趣,这是在我的笔记本电脑上运行的测试的结果。这次写入 5 亿个条目并在第二个线程中读取它们(在写入时)需要多长时间,只用了 12 秒多一点。

Rate = 41.0 Mmsg/sec for 16 byte messages

测试是 IndexedChronicleTest 中的 multiThreaded( )

于 2013-09-27T22:29:59.003 回答
0

最好的方法可能是序列化ArrayList到磁盘。

确保列表的内容是可序列化的,即列表中的对象应该实现Serializable接口。

然后
写入文件:

ObjectOutputStream oos = new ObjectOutputStream(new FileOutputStream(fileName));
oos.writeObject(list);
oos.flush();
oos.close();

从文件中读取:

ObjectInputStream ois = new ObjectInputStream(new FileInputStream(fileName));
List<YourClass> list = ois.readObject();
ois.close()
于 2013-09-27T22:32:32.767 回答