这是我打算存储在磁盘中的对象,
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 +),我应该在代码的容易性和大小之间找到平衡点。有没有办法实现这种平衡?如果有任何其他方法来存储与序列化相比缩小的数据,请告诉我。我不能使用任何外部库。
答案 0 :(得分:3)
BTW您不需要列表包装器将多个项目写入文件,但您的项目需要是Serializable。
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听起来很小。我对我的序列化/ peristsence库进行了测试,它可以在几秒钟内写入并读取10,000,000个条目。因为列表的大小可能非常高(~10k +),
我应该在代码和大小之间找到平衡点。有没有办法实现这种平衡?
我怀疑你需要担心的是轻松。如果你想让文件变小,你可以通过用GZIP或deflator / inflator stream包装文件流来压缩文件。这会增加一行代码,并使文件缩小4倍。
与序列化相比,请告诉我是否有其他方法可以缩小尺寸存储数据。我不能使用任何外部库。
他们都需要外部库。你可以使用XMLEncoder和XMLDecoder,但这会更慢更大。
因为我有一个问题;如果您对我的库感兴趣Java Chronicle 2.x以下是我的笔记本电脑上运行测试的结果。这次写入5亿个条目并在第二个帖子中读取它们需要多长时间(因为它们正在写入)它花了超过12秒。
Rate = 41.0 Mmsg/sec for 16 byte messages
中的multiThreaded()
答案 1 :(得分: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()