gpt4 book ai didi

java - 使用 GZip 支持编写游戏文件存储?

转载 作者:行者123 更新时间:2023-12-01 05:53:09 26 4
gpt4 key购买 nike

    public static void loadModels() {
try {
DataInputStream indexFile = new DataInputStream(new FileInputStream("./cache/models.idx"));
DataInputStream dataFile = new DataInputStream(new FileInputStream("./cache/models.dat"));
int length = indexFile.readInt();
for(int i = 0; i < length; i++) {
int id = indexFile.readInt();
int invlength = indexFile.readInt();
byte[] data = new byte[invlength];
dataFile.readFully(data);
//System.out.println("ID: "+ id +" Length: "+ invlength +" Data: "+ data);
Class30_Sub2_Sub4_Sub6.method460(data, id);
}
indexFile.close();
dataFile.close();
} catch (Exception e) {
e.printStackTrace();
}
}

这是我加载模型的空白(顺便说一句,其中有 57056 个模型) Method460(data, id);指从存储中调用模型。

package com.rs.modelcompressor.file;

import java.io.File;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.DataOutputStream;
import java.util.List;
import java.util.ArrayList;

import com.rs.modelcompressor.Main;

public class FileController {

private List<Model> modelList = new ArrayList<Model>();

public FileController() {
}

private byte[] build() {
byte[] returnValue;
int i = 0;
for(Model m : modelList) {
i += m.getData().length;
}
returnValue = new byte[i];
int offset = 0;
for(Model model : modelList) {
Main.getUserInterface().getTextArea().append("Copying Model Data: "+ model.getId()+"\n");
System.arraycopy(model.getData(), 0, returnValue , offset, model.getData().length);
offset += model.getData().length;
}
return returnValue;
}

public void compress() {
int offset = 0;
if(modelList.size() == 0) {
Main.getUserInterface().getTextArea().append("No models loaded\n");
return;
}

try {
byte[] data = build();
Main.getUserInterface().getTextArea().append("Creating data file\n");
DataOutputStream dataFile = new DataOutputStream(new FileOutputStream("models.dat"));
dataFile.write(data, 0, data.length);
Main.getUserInterface().getTextArea().append("Length of written data: "+ data.length +"\n");
dataFile.flush();
dataFile.close();
} catch (Exception e) {
Main.getUserInterface().getTextArea().append("An error occured while writing data file\n");
}
try {
Main.getUserInterface().getTextArea().append("Creating index file\n");
DataOutputStream indexFile = new DataOutputStream(new FileOutputStream("models.idx"));
indexFile.writeInt(modelList.size());
for(Model m : modelList) {
indexFile.writeInt(m.getId());
indexFile.writeInt(m.getData().length);
}
indexFile.flush();
indexFile.close();
} catch (Exception e2) {
Main.getUserInterface().getTextArea().append("An error occured while writing index file\n");
}
Main.getUserInterface().getTextArea().append("model.dat and model.idx created\n");
}

public void loadModels() {
modelList.clear();
File[] file = new File("models/").listFiles();
Main.getUserInterface().getTextArea().append("Found "+ file.length +" model files\n");
for(File f : file) {
byte[] data = new byte[(int)f.length()];
try {
FileInputStream in = new FileInputStream(f);
in.read(data);
in.close();
} catch (Exception e) {
Main.getUserInterface().getTextArea().append(e.getMessage()+"\n");
}
String s = f.getName();
int id = Integer.parseInt(s.substring(0, s.indexOf(".")));
Main.getUserInterface().getTextArea().append("ID: "+ id +" Data: "+ data +" Length: "+ (int)f.length()+"\n");
Model m = new Model();
m.setData(data);
m.setId(id);
modelList.add(m);
}
}

那是压缩器类,但我不知道这样做。

看,我想对模型文件进行 GZip 压缩以减小文件大小...但是,如果我压缩 gzip 压缩的文件,它将使用 .idx 调用它们,这将导致使用错误的大小 => 错误...我应该如何解决这个问题,文件在 .dat 内进行 GZipped,但 .idx 具有未压缩文件的大小/长度/w.e,以及如何使加载程序支持 gzip?

最佳答案

  1. 分别压缩每个单独的模型并将结果连接到 models.dat 文件中。
  2. 将压缩长度和偏移量添加到 models.idx 中。
  3. 读取模型时,使用 models.idx 中的压缩长度和偏移量从 models.dat 中读取字节 block 并解压缩该 block ,结果将是未压缩模型。

或者你可以使用类似的东西 ZipFile类(class)。您可以将模型文件打包到 zip 文件中,并为每个模型提供唯一的文件名,然后使用此类代码来获取模型数据。这可能比使用上述 GZIP 方法稍慢,但编码更简单。

zipFile = new ZipFile("models.zip");
ZipEntry zipEntry = zipFile.getEntry(modelFilename);
InputStream input = getInputStream(zipEntry);

关于java - 使用 GZip 支持编写游戏文件存储?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3956165/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com