一种实现你想要的方法是使用序列化和对象流将二进制数据存储到文件中。基本上,你将会存储你的数组对象,或者地形块的对象(或者你称之为地形子区块的任何东西)。这样可以实现更快的加载时间,因为JVM在加载时不需要重新构建每个对象。
使用二进制文件的主要优点是,当你希望存储数据时,你不必编写任何算法,甚至不必迭代数据。由于你提到你想频繁存储,这可能是一个很好的解决方案。
以下是一个示例,以便给你一些指导。
假设:
class Chunk implements java.io.Serializable {
private static final long serialVersionUID = 1L;
Block[][][] chunkBlocks;
}
通过在类定义中添加语句
implements Serializable
,您表示该类可用于从字节流中读取和写入对象,从而允许您将它们存储并从文件中读取。还有一件事要注意的是变量
serialVersionUID
。这非常重要,因为它将告诉流这个对象属于哪个类,以及是否可以将其强制转换为该类。(注意:这是一个粗略的近似,但出于不冗长的考虑,我会跳过细节)。现代IDE(如
eclipse或
IntelliJ)将提示您在实现Serializable接口时向类中添加此变量。它们还会为您提供生成唯一ID的选项。建议这样做以确保没有冲突。
最后,以下是如何存储对象的方法:
public static void save(Object o, String filename) {
FileOutputStream fos = null;
ObjectOutputStream oop = null;
try {
fos = new FileOutputStream(filename);
oop = new ObjectOutputStream(fos);
oop.writeObject(o);
oop.flush();
fos.flush();
oop.close();
fos.close();
} catch (IOException e) {
e.printStackTrace();
}
}
并加载一个:
public static Object load(String filename) {
FileInputStream in;
ObjectInputStream ois;
Object o = null;
try {
in = new FileInputStream(filename);
ois = new ObjectInputStream(in);
o = ois.readObject();
ois.close();
in.close();
} catch (IOException e) {
e.printStackTrace();
} catch (ClassNotFoundException e) {
e.printStackTrace();
}
return o;
}
在上面的代码中,我将函数概括为接受和返回
java.lang.Object
,但如果您希望有一个专门针对特定类的函数,您可以更改它为Chunk或其他内容。
您还提到了Minecraft文件格式,但这些格式非常应用程序特定,并且基本上是以它自己能理解的格式。除此之外,它们不适合频繁保存,而是更适合后台块卸载。
希望这有所帮助!