Java 超过65535字节限制的构造函数

Java 超过65535字节限制的构造函数,java,arrays,limit,Java,Arrays,Limit,我有一个类,用于存储游戏世界的地形。游戏世界由立方体组成,每个立方体都有一个地形。信息存储为一个相当大的三维整数数组 我现在遇到的问题是,我的“映射”太大,无法存储在类(或枚举)中。因为我对类和枚举之外的东西一无所知,所以我不知道如何处理它 我应该用它制作一个tekst文件并读出来吗?如果是,我该怎么做 另一种解决方案是将映射拆分为几个类或枚举,然后在运行时再次合并它们,但我也不知道如何做到这一点,这似乎是一个非常糟糕的解决方案 编辑:这是世界地图的一部分: 0 0 0 0 0 0 0 0 0

我有一个类,用于存储游戏世界的地形。游戏世界由立方体组成,每个立方体都有一个地形。信息存储为一个相当大的三维整数数组

我现在遇到的问题是,我的“映射”太大,无法存储在类(或枚举)中。因为我对类和枚举之外的东西一无所知,所以我不知道如何处理它

我应该用它制作一个tekst文件并读出来吗?如果是,我该怎么做

另一种解决方案是将映射拆分为几个类或枚举,然后在运行时再次合并它们,但我也不知道如何做到这一点,这似乎是一个非常糟糕的解决方案

编辑:这是世界地图的一部分:

 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 1 0 1 1 1
 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 1 1 1 1 1
 0 0 0 0 0 0 0 0 0 2 2 0 0 0 1 1 1 1 1 1
 0 0 0 0 0 0 0 0 0 2 2 0 0 0 1 1 1 1 1 1
 0 0 0 0 0 0 0 0 0 2 2 2 2 1 1 1 1 1 1 1
 0 0 0 0 1 0 0 0 0 2 2 2 2 1 1 1 1 1 1 1
 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 1 1 1 1 1
 0 0 0 0 0 0 0 0 0 0 1 0 0 1 1 1 1 1 1 1
 0 0 0 0 0 0 0 1 0 1 0 0 1 0 1 1 1 1 0 0
 0 0 0 0 0 0 0 0 1 1 1 1 1 1 1 1 1 1 1 0
 0 0 0 0 0 0 0 0 1 1 1 1 1 1 1 1 1 1 0 0
 0 0 0 0 0 0 0 0 0 1 1 1 1 1 1 1 1 0 0 0
 0 0 0 0 0 0 0 0 0 1 1 1 1 1 1 1 0 0 0 0
 0 0 0 0 0 0 0 0 0 0 1 1 1 1 0 0 0 0 0 0
 0 0 0 0 0 0 0 0 0 0 0 1 1 1 0 0 0 0 0 0
 0 0 0 0 0 0 0 0 0 0 1 1 1 1 0 1 0 0 0 0
 0 0 1 0 0 0 0 0 0 0 0 1 1 1 1 0 0 0 0 0
 0 0 1 1 1 0 0 0 0 0 0 1 1 1 1 0 0 0 0 0
 0 0 1 1 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0
 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0

 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 1 0
 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 0 0
 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 1 1 0
 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 1 1 1 1
 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 1 1 1 1
 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 0 1 1 1 1
 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 1 1 1 1
 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 1 0 1 1 1
 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 1 1 0 0
 0 0 0 0 0 0 0 0 0 1 0 1 1 1 1 1 1 1 0 0
 0 0 0 0 0 0 0 0 0 1 1 1 0 1 1 1 1 1 0 0
 0 0 0 0 0 0 0 0 0 0 1 1 1 0 0 1 0 0 0 0
 0 0 0 0 0 0 0 0 0 0 1 1 1 1 1 0 0 0 0 0
 0 0 0 0 0 0 0 0 0 0 1 1 1 1 0 0 0 0 0 0
 0 0 0 0 0 0 0 0 0 0 0 1 1 0 0 0 0 0 0 0
 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0
 0 0 0 0 0 0 0 0 0 0 0 1 1 0 1 0 0 0 0 0
 0 0 0 0 0 0 0 0 0 0 0 1 1 1 0 0 0 0 0 0
 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0
其中有40个块(38个以上),每一个块都代表某个z坐标处的世界。我也有这个阵列格式。
如果您能提供一些(示例)代码,说明如何从文件中读取此内容,那就太好了。

您能显示您的错误吗

如果您不需要加载所有地图,您可以将地图分块,并将所有地图保存为Xml格式,例如:

<map>
   <chunk x=0 y=0> 
      <!--chunk informations>
   </chunk>
   <chunk x=0 y=1> 
      <!--chunk informations>
   </chunk>
   <!--other chunks>
</map>
public int[][][] loadMap() {
    try (BufferedReader reader = new BufferedReader(new InputStreamReader(getClass()
            .getResourceAsStream("map.txt"), StandardCharsets.ISO_8859_1))) {

        List<int[][]> result = new ArrayList<>();
        List<int[]> cur = new ArrayList<>();
        String line;
        while((line = reader.readLine()) != null) {
            line = line.trim();
            if(line.isEmpty() && !cur.isEmpty()) {
                result.add(cur.toArray(new int[0][]));
                cur.clear();
            } else {
                String[] cells = line.split("\\s+");
                int[] row = new int[cells.length];
                for(int i=0; i<cells.length; i++) row[i] = Integer.parseInt(cells[i]);
                cur.add(row);
            }
        }
        if(!cur.isEmpty())
            result.add(cur.toArray(new int[0][]));
        return result.toArray(new int[0][][]);
    } catch (IOException e) {
        throw new UncheckedIOException(e);
    }
}


如果在您的用例中可能的话,您可以使用
字节[]
块,甚至
短[]
。那么您应该在
65535
字节限制之内

size för byte[] : 20 x 20 x 40 x 1 = 16000 bytes
size för short[]: 20 x 20 x 40 x 2 = 32000 bytes

最好把它投入资源。只需在你的类旁边创建一个文本文件(例如名为
map.txt
),将你的世界地图以你在问题中使用的相同格式放在那里,然后使用如下代码加载:

<map>
   <chunk x=0 y=0> 
      <!--chunk informations>
   </chunk>
   <chunk x=0 y=1> 
      <!--chunk informations>
   </chunk>
   <!--other chunks>
</map>
public int[][][] loadMap() {
    try (BufferedReader reader = new BufferedReader(new InputStreamReader(getClass()
            .getResourceAsStream("map.txt"), StandardCharsets.ISO_8859_1))) {

        List<int[][]> result = new ArrayList<>();
        List<int[]> cur = new ArrayList<>();
        String line;
        while((line = reader.readLine()) != null) {
            line = line.trim();
            if(line.isEmpty() && !cur.isEmpty()) {
                result.add(cur.toArray(new int[0][]));
                cur.clear();
            } else {
                String[] cells = line.split("\\s+");
                int[] row = new int[cells.length];
                for(int i=0; i<cells.length; i++) row[i] = Integer.parseInt(cells[i]);
                cur.add(row);
            }
        }
        if(!cur.isEmpty())
            result.add(cur.toArray(new int[0][]));
        return result.toArray(new int[0][][]);
    } catch (IOException e) {
        throw new UncheckedIOException(e);
    }
}
public int[]loadMap(){
try(BufferedReader=new BufferedReader(new InputStreamReader(getClass)()
.getResourceAsStream(“map.txt”),StandardCharsets.ISO_8859_1))){
列表结果=新建ArrayList();
List cur=new ArrayList();
弦线;
而((line=reader.readLine())!=null){
line=line.trim();
if(line.isEmpty()&&!cur.isEmpty()){
结果.add(cur.toArray(newint[0][]);
cur.clear();
}否则{
字符串[]单元格=行。拆分(\\s+);
int[]行=新的int[cells.length];

对于(int i=0;iI建议您不要将其拆分为不同的类,而是存储在一个文件中。尝试内存映射的方法,并根据需要在节中读取内存。而不是将数组定义为代码中的文字,您可以将数据存储在一个文件中并从磁盘读取以将其放入数组中。@Jay我需要初始化数组的全部内容他是一个世界。@Jire我一直在想这个问题,但我的问题是:我不知道怎么做。我需要初始化整个世界的所有东西。如果一次就可以访问整个世界会容易得多。但是:我不知道如何从另一个文件加载信息。这应该是一个注释,而不是一个答案。参见@Sander你不知道如何读取文本文件吗?你可以使用Scanner类。它非常简单易学,但是如果你想使用Xml,你需要更多(我认为这是一个更好的选择)你可以使用DOM解析器。这有点难学,但你需要少编写代码。@bhspencer但我没有50%的声誉来评论这个问题。所以我需要写一个答案。这可能是我的小地图的解决方案,但它们会上升到80x80x80=512 000,所以对于更大的地图,这仍然是一个问题。谢谢,这是一个问题我所需要的。