将4D阵列保存到文件时出现问题

时间:2012-10-15 03:56:32

标签: java arrays multidimensional-array

我有一些代码似乎没有按照应有的方式运行。整点是采用256x128x256x2整数数组,将其拆分为256个16x128x16x2块,将块处理成字节数组,然后将该字节数组添加到要保存的主字节数组中。保存前chunkdata[]没问题,但保存后整个文件除了前4096字节外都是空白的。位置表(文件中每个块的位置)在那里,前四个字节“块头”在那里,其他一切都是0,这是不应该发生的。

public void createFile(int[][][][] map){
    byte[] file = new byte[fileLength]; //22,024,192 bytes long
    System.arraycopy(Sector.locationTable, 0, file, 0, Sector.locationTable.length); //This works as it should
    for(int cx = 0; cx < 16; cx++)
    {
        for(int cz = 0; cz < 16; cz++)
        {
            int start = sectorLength+cx*(sectorLength*chunkSectorLength)+cz*(chunkRows*sectorLength*chunkSectorLength); //this algorithm works, just rather hideous 
            int[][][][] chunk = getChunk(map, cx * 16, cz * 16); //This works as it should
            byte[] chunkdata = putChunk(chunk); //The data from this is correct

            int counter = 0;
            for(int i=start;i<chunkdata.length;i++){
                file[i]=chunkdata[counter]; //Data loss here?
                counter++;
            }
        }
    }
    System.out.println("Saving file...");
    writeFile(file, fileLocation);
}

public static void writeFile(byte[] file,String filename){
    try{
        FileOutputStream fos = new FileOutputStream(filename);
        fos.write(file);
        fos.close();
        Messages.showSuccessfulSave();
    }catch(Exception ex){
        Messages.showFileSavingError(ex);
    }
}

因此,假设putChunk和getChunk按预期工作,以及我的可怕算法,是什么可能导致超过前4096字节的所有内容都为空?

提前致谢。

1 个答案:

答案 0 :(得分:1)

为什么在ichunkdata.length初始化时,istart进行比较?我认为应该使用counter

电流:

   int counter = 0;
   for(int i=start;i<chunkdata.length;i++){
      file[i]=chunkdata[counter]; //Data loss here?
      counter++;
   }

相反,你想写这样的东西:

   int counter = 0;
   for(int i=start;counter<chunkdata.length;i++){
       file[i]=chunkdata[counter]; //Data loss here?
       counter++;
   }

或更紧凑的方式:

   for(int i=start,counter = 0;counter<chunkdata.length;i++,counter++){
       file[i]=chunkdata[counter]; //Data loss here?
   }