用java将大量对象存储到磁盘的最佳方法
这是我计划存储在磁盘中的对象用java将大量对象存储到磁盘的最佳方法,java,serialization,Java,Serialization,这是我计划存储在磁盘中的对象 public class SObject { /** * */ private String value; private int occurences; private String key; public String getValue() { return value; } public void setValue(String value) {
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;
}
}
public类ToDisk实现可序列化{
列出sobj;
公共列表getSobj(){
返回sobj;
}
公共无效设置对象(列表sobj){
this.sobj=sobj;
}
}
这是一种用最少的代码编写数据的有效方法吗?我还发现通过使用序列化从磁盘读取数据更容易。因为列表的大小可能非常大(~10k+),我应该在代码的易用性和大小之间找到平衡。有没有办法达到这种平衡?请让我知道是否有任何其他方法来存储数据,与序列化相比,数据的大小会减小。我不能使用任何外部库。顺便说一句,您不需要列表包装器将许多项写入文件,但您的项需要可序列化
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();
读压缩的
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()
测试是多线程的(最好的方法可能是将
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()
ObjectInputStream ois=newobjectinputstream(newfileinputstream(fileName));
List=ois.readObject();
ois.close()
您不需要使用该列表;您可以将多个对象序列化为一个文件,并以相同的顺序将其读回。您确定您真正需要的不是一个简单的数据库吗?@Deadron我不能/不应该使用数据库,只需简单的文件写入。查找基于磁盘的集合我只能找到外部库,我不能使用任何外部库。flush()是多余的。我对我的序列化/peristsence库进行了测试-那是哪个库?@Jitendra这是Java编年史,我的测试显示,在笔记本电脑上每秒写入4000万条消息,在另一个进程中读取消息的延迟为0.6微秒。是较旧的版本,是更快、更新和改进的版本。System.out.println(objList.size());//打印大小时请尝试{ObjectOutputStream oos=new ObjectOutputStream(new FileOutputStream(“\\users\\naren\\folder\\test.txt”);oos.writeObject(objList);oos.close();}catch(异常e){e.printStackTrace();}//没有引发错误,但我看不到文件。我遗漏了什么吗?如果你在linux上运行这个,你需要查找一个名为\users\naren\folder\test.txt的文件,注意\在linux上只是一个字符。可能您想要的是/users/naren/folder/test.txt
,也可能是一个不同的扩展名,因为这不是文本。
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()