读取文件

时间:2017-05-01 15:30:02

标签: java file try-catch

我创造了一个游戏,在屏幕上有狗和猫以及狗和猫的房子。我有它工作得很好,并有一个随机将它们放在屏幕上的方法,但我想让某人能够使用带坐标的文本文件将它们放在屏幕上。所以我想创建一个方法来做到这一点。 所以我有一个名为levels的文件夹,它有2个记事本文件,一个叫做level1,另一个叫做level2。在第一个文件中,它看起来像这样。

DOG @ 79.0, 409.0
DOG @ 150.0, 320.0
CAT @ 73.0, 194.0
DOG_HOUSE @ 72.0, 158.0
CAT_HOUSE @ 51.0, 591.0

第二个文本文件包含类似的东西,但有点不同。

DOG @ 79.0, 129.0
DOG @ 150.0, 245.0
DOG_HOUSE @ 93.0, 276.0
CAT_HOUSE @ 101.0, 532.0
DOG @ 91.0, 93.
CAT @ 123.0, 294.0

我创建这些对象的方式就是这样。基本上我创建了对象,然后将其添加到相应的数组中,然后在屏幕上显示对象,我只需要更新每个数组。

 Dogs dog = new Dogs(xvalue,yvalue);
 Cats cat = new Cats(xvalue,yvalue);
 Dog_House doghouse = new Dog_House(xvalue,yvalue);
 Cat_House cathouse = new Cat_House(xvalue,yvalue);

基本上它们只是对象的名称,然后是它们想要在屏幕上的位置的坐标。所以我需要读入文件,确定它是哪个对象,并使用给定的坐标创建一个新类型的对象。我猜这个方法首先将每一行存储到一个全新的数组中是最容易的。然后我应该做一些if语句,以便当扫描仪看到CAT时它将创建一个坐标位于@符号另一侧的对象。我想我可以在while语句中使用一些指导来正确读取行,然后使用该行中的信息创建一个对象。这就是我到目前为止所做的。感谢。

private boolean loadCustomLevel(String levelFilename) 
{ 

    File inFile = new File(levelFilename);

    Scanner input = null;
    try{
        input = new Scanner (inFile);

        while(input.hasNextLine()){

            }
    }
    catch(FileNotFoundException e){
        System.err.println("Error: unable to open file: " + inFile);

    }

    return false;
}

1 个答案:

答案 0 :(得分:0)

您应该将阅读文件的方式更改为:

String input = null;
BufferedReader br = null;

try {
    FileReader file = new FileReader(levelFilename);
    br = new BufferedReader(file);

    while ((input = br.readLine()) != null) {
        System.out.println(input);
    }
} catch (IOException e) {
    System.err.println("Error: unable to open file");
} finally {
    if (br != null) {
        try {
            br.close();
        } catch (IOException e) {}
    }
}

在while循环中有几种方法可以使用。您当前的文件在值之间具有不同的分隔符。有" @",空格和逗号。一种方法是你可以使用相同的分隔符,这样行就像这样:

DOG,79.0,409.0
DOG,150.0,320.0
CAT,73.0,194.0
DOG_HOUSE,72.0,158.0
CAT_HOUSE,51.0,591.0

通过这种方式,您可以在逗号上分割每一行,并根据需要包含所有元素。

如果要保留当前格式,可以使用正则表达式匹配每一行,并将每个元素作为一组检索。

// just a starting point
Matcher m = Pattern.compile("^([A-Za-z\\_]+)\\s*\\@\\s*([0-9\\.]+)\\s*\\,\\s*([0-9\\.]+)$").matcher(input);

System.out.println(m.group(1) + " " + m.group(2) + " " + m.group(3));

这将返回所需的3个元素:

DOG 79.0 129.0
DOG 150.0 245.0
DOG_HOUSE 93.0 276.0
CAT_HOUSE 101.0 532.0
DOG 91.0 93.
CAT 123.0 294.0

无论哪种方式,一旦你拥有了每行的元素,你就可以在第一个元素上做一个switch或if语句来决定它是哪个对象,然后相应地继续。