Java 使用GZip支持编写游戏文件存储? publicstaticvoidloadmodels(){ 试一试{ DataInputStream indexFile=新的DataInputStream(新文件InputStream(“./cache/models.idx”); DataInputStream数据文件=新的DataInputStream(新文件InputStream(“./cache/models.dat”); int length=indexFile.readInt(); for(int i=0;i错误…我该如何计算呢?因此,文件被GZip压缩在.dat中,但是.idx具有未压缩文件的大小/长度/w.e以及如何生成loa支持gzip吗 分别压缩每个单独的模型,并将结果连接到models.dat文件 将压缩长度和偏移量添加到models.idx 读取模型时,使用models.idx的压缩长度和偏移量从models.dat读取一个字节块,然后解压缩该块,将生成未压缩的模型

Java 使用GZip支持编写游戏文件存储? publicstaticvoidloadmodels(){ 试一试{ DataInputStream indexFile=新的DataInputStream(新文件InputStream(“./cache/models.idx”); DataInputStream数据文件=新的DataInputStream(新文件InputStream(“./cache/models.dat”); int length=indexFile.readInt(); for(int i=0;i错误…我该如何计算呢?因此,文件被GZip压缩在.dat中,但是.idx具有未压缩文件的大小/长度/w.e以及如何生成loa支持gzip吗 分别压缩每个单独的模型,并将结果连接到models.dat文件 将压缩长度和偏移量添加到models.idx 读取模型时,使用models.idx的压缩长度和偏移量从models.dat读取一个字节块,然后解压缩该块,将生成未压缩的模型,java,Java,这是我加载我的模型(顺便说一下,有57056个)方法460(数据,id)的空白;指从存储器调用模型 public static void loadModels() { try { DataInputStream indexFile = new DataInputStream(new FileInputStream("./cache/models.idx")); DataInputStream dataFile = new DataInputStre

这是我加载我的模型(顺便说一下,有57056个)方法460(数据,id)的空白;指从存储器调用模型

    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();
    }
}
包com.rs.modelcompressor.file;
导入java.io.File;
导入java.io.FileInputStream;
导入java.io.FileOutputStream;
导入java.io.DataOutputStream;
导入java.util.List;
导入java.util.ArrayList;
导入com.rs.modelcompressor.Main;
公共类文件控制器{
private List modelList=new ArrayList();
公共文件控制器(){
}
专用字节[]生成(){
字节[]返回值;
int i=0;
用于(m型:模型列表){
i+=m.getData().长度;
}
returnValue=新字节[i];
整数偏移=0;
对于(模型:模型列表){
Main.getUserInterface().getTextArea().append(“复制模型数据:“+Model.getId()+”\n”);
System.arraycopy(model.getData(),0,returnValue,offset,model.getData().length);
偏移量+=model.getData().length;
}
返回值;
}
公共空间压缩(){
整数偏移=0;
if(modelList.size()==0){
Main.getUserInterface().getTextArea().append(“未加载模型”);
回来
}
试一试{
字节[]数据=build();
Main.getUserInterface().getTextArea().append(“创建数据文件”);
DataOutputStream数据文件=新的DataOutputStream(新的FileOutputStream(“models.dat”));
写入(数据,0,数据长度);
Main.getUserInterface().getTextArea().append(“写入数据的长度:“+data.Length+”\n”);
dataFile.flush();
dataFile.close();
}捕获(例外e){
Main.getUserInterface().getTextArea().append(“写入数据文件时出错\n”);
}
试一试{
Main.getUserInterface().getTextArea().append(“创建索引文件\n”);
DataOutputStream indexFile=新的DataOutputStream(新文件OutputStream(“models.idx”));
index.writeInt(modelList.size());
用于(m型:模型列表){
writeInt(m.getId());
indexFile.writeInt(m.getData().length);
}
indexFile.flush();
indexFile.close();
}捕获(异常e2){
Main.getUserInterface().getTextArea().append(“写入索引文件时出错\n”);
}
Main.getUserInterface().getTextArea().append(“model.dat和model.idx已创建\n”);
}           
公共模型(){
modelList.clear();
File[]File=新文件(“models/”).listFiles();
Main.getUserInterface().getTextArea().append(“find”+file.length+“model files\n”);
for(文件f:File){
字节[]数据=新字节[(int)f.length()];
试一试{
FileInputStream in=新的FileInputStream(f);
in.读取(数据);
in.close();
}捕获(例外e){
Main.getUserInterface().getTextArea().append(例如getMessage()+“\n”);
}
字符串s=f.getName();
int id=Integer.parseInt(s.substring(0,s.indexOf(“.”));
Main.getUserInterface().getTextArea().append(“ID:+ID+”数据:“+Data+”长度:“+(int)f.Length()+”\n”);
模型m=新模型();
m、 setData(数据);
m、 setId(id);
模型列表。添加(m);
}       
}
那是压缩机课,但我不知道该怎么做

听着,我想GZip模型文件以减小文件大小…但是,如果我压缩GZip文件,它将使用.idx调用它们,这将导致使用错误的大小=>错误…我该如何计算呢?因此,文件被GZip压缩在.dat中,但是.idx具有未压缩文件的大小/长度/w.e以及如何生成loa支持gzip吗

  • 分别压缩每个单独的模型,并将结果连接到
    models.dat
    文件
  • 将压缩长度和偏移量添加到
    models.idx
  • 读取模型时,使用
    models.idx
    的压缩长度和偏移量从
    models.dat
    读取一个字节块,然后解压缩该块,将生成未压缩的模型
  • 或者你可以用类似的东西 在这里,您可以将模型文件打包为zip文件,并为每个模型提供唯一的文件名,只需使用此类代码来获取模型数据。这可能比使用上述GZIP方法稍微慢一些,但编码更简单

    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);
        }       
    }
    
    zipFile = new ZipFile("models.zip");
    ZipEntry zipEntry = zipFile.getEntry(modelFilename);
    InputStream input = getInputStream(zipEntry);