Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/379.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
用java将大量对象存储到磁盘的最佳方法_Java_Serialization - Fatal编程技术网

用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()