Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/313.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 将二维数组文件读入二维数组_Java_Arrays - Fatal编程技术网

Java 将二维数组文件读入二维数组

Java 将二维数组文件读入二维数组,java,arrays,Java,Arrays,我正在制作一个自上而下的rpg游戏,我计划使用txt文件和2D数组进行关卡,我将有一个2D数组,包含0到6的值,每个值代表不同的纹理,我计划将这些关卡保存在txt文件中,但我在将文件读入2D数组时遇到困难 int level_1[][] = new int[14][25]; 这就是我的文件的样子 0000000010000000044444444 0000050010000005504444444 0050000010000000005544444 0005000010000000000550

我正在制作一个自上而下的rpg游戏,我计划使用txt文件和2D数组进行关卡,我将有一个2D数组,包含0到6的值,每个值代表不同的纹理,我计划将这些关卡保存在txt文件中,但我在将文件读入2D数组时遇到困难

int level_1[][] = new int[14][25];
这就是我的文件的样子

0000000010000000044444444
0000050010000005504444444
0050000010000000005544444
0005000010000000000550550
0000000011111000333333333
0000000000001111100000000
0005000055000010000000000
0000000000000010000000000
0000050000500010000000000
0000000000000010000000000
0000000050005010000000200
0001111111111112200002000
0501000000000002200002000
0051000000000000000002000
这是我在数组中读取的代码,顺便说一下,它是14x25

public int[][] readInLevel(String levelNumber)
    {

        try
        {
            BufferedReader in = new BufferedReader(new InputStreamReader(new FileInputStream(levelNumber)));
            while (in.ready() == true)
            {

                for (int row = 0; row <= 13; row++)
                {
                    for (int column = 0; column <= 24; column++)
                    {
                        level_1[row][column] = in.read();
                    }
                }
            }
        } catch (Exception e)
        {
            System.out.println(e);
        }

        return null;

    }

in.read
读取ASCII字节。请注意,Asciii中的“0”是48。因此,从in.read中减去48,如下所示:
level_1[row][column]=in.read()-48如果不起作用,则转换为int:
级别1[行][列]=(int)(in.read-48)

编辑:好的,有一种方法你可以做到,那就是我做的。 编辑:检查换行符

byte b=0;
int row=0;
int column=0;
while((b=in.read())!=1) {
    if((char)b=='\n') {
        row++;
        column=0;
    } else {
        level_1[row][column]=b-48;
        column++;
    }
}
行/列代码可能有一些问题,我没有仔细考虑

编辑:好的,找到问题了。如果没有字节,则BufferedReader.read()返回-1,这意味着它每次返回-49,因为它返回-1-48。这意味着您的读取器没有正确初始化。检查你的档案。我通常会:

File f=new File(path);
FileReader fr=new FileReader(f);
BufferedReader reader=new BufferedReader(fr);
好的,这是我的代码:

它工作正常,请查看输出。

Circuit Smasher是正确的,您应该将ascii值减去48,以获得与级别文件中的字符对应的int。您看到的是-49,因为-1(read()的EOF返回值)减去48就是-49

for
循环中的限制让人难以理解;也许你应该考虑把它们改为

for(int row=0;row<14;row++)

然后,记住每行的第15个字符是换行符。这将偏移网格。我们可以通过阅读来摆脱这个换行符。(您也可以使用
BufferedReader.read()
的另一个定义从每行输入中获取前14个字符,也可以使用
Scanner
类,该类具有获取整行输入的功能。)

以下代码段似乎运行正常(我添加了一些打印语句以确保其有效性):

int[]1级=新的int[14][25];
试一试{
BufferedReader in=新的BufferedReader(新的InputStreamReader(
新文件InputStream(“input.txt”);
while(in.ready()==true){
对于(int行=0;行<14;行++){
for(int列=0;列<25;列++){
第1级[行][列]=in.read()-48;
系统输出打印(第1级[行][列]+“,”;
}
in.read();//这很重要
System.out.println(“”);
}
}
}捕获(例外e){
e、 printStackTrace();
}

附加编辑:您正在使用IDE吗?在Eclipse中,输入文件需要位于正在处理的项目的根目录中。其他IDE可能会有所不同。如果您仍然收到一堆-49,那么我认为该文件没有被正确读取。

您还没有真正提出问题。有什么问题吗?@chrylis当我读入数组时,所有的数字都是-49。还有一件事与问题无关:按照惯例,使用“e.printStackTrace()”。通常,打印出对象只会打印出关于对象的数据,其中通常包括指针和其他内容。除非Exception有一个惟一的toString(),否则它将不起作用(但我不确定)。我可以看看您的其余代码吗?你有一个返回数组的函数,但你似乎把它当作一个void函数。是的,我把它切换回void。我的其余代码与数组无关,我认为导致问题的原因是它试图一次读取整行,而不是一次读取一个int。解决这个问题的办法是什么?这有点奏效,一些数字成功了。虽然大多数是0。嗯,可能大多数是0,因为您的文件大多是0?另外,不要处理它,而是尝试执行System.out.print((char)b);因为它一个字符一个字符地读取,如果你不按原样打印文件,你的bufferedreader就有一个错误。不,我的文件在我的问题中,只有右上角的4行显示出来。再加上他所说的,试试file f=new file(“input.txt”);然后做f.createNewFile();这将允许您查看文件的创建位置。将您的文件放在那里。我最初在
BufferedReader
构造函数中添加了一个
新文件(文件名)
,但它似乎不是必需的;对我来说都适用。编辑:我误读了您的评论,Circuit Smasher。这是确定文件位置的好方法。
   int[][] level_1 = new int[14][25];
   try {
   BufferedReader in = new BufferedReader(new InputStreamReader(
                new FileInputStream("input.txt")));
        while (in.ready() == true) {

            for (int row = 0; row < 14; row++) {
                for (int column = 0; column < 25; column++) {

                    level_1[row][column] = in.read() - 48;
                    System.out.print(level_1[row][column] + ", ");
                }
                in.read(); // this is important

                System.out.println("");
            }
        }
    } catch (Exception e) {
        e.printStackTrace();
    }