如何在缓冲读卡器中执行复杂的操作(循环)?

时间:2013-12-04 01:05:17

标签: java parsing loops bufferedreader

我试图通过从文本文件中读取数据来初始化类字段。示例文本文件如下所示:

Movies
Lord of the Rings: 180
Fight Club: 120
Theaters
A:100
B:50
C:200
Shows
1,1,960
1,1,1080
1,1,1200
1,3,1020
1,3,1140
2,2,990
2,2,1210
Prices
Adult:10
Child:7
Senior:8
End

以下是我的代码,它返回一个ArrayIndexOutOfBoundsException。

在此代码中,我尝试将文件“Movies”类别下的行解析为类字段,该字段是电影的数组列表。甲

电影的字段名称(字符串)和长度(字符串)。我通过在行中使用delmiter“:”分割行来尝试这个(以分割电影名称和长度编号)。

    public static void inititializeFromFile(String fileName) 
            throws IOException {

        BufferedReader reader = new BufferedReader(new FileReader(fileName));
        String line;
        while((line = reader.readLine()) != null) {

            if(line.equals("Movies")) {

                while (!(line.equals("Theaters"))) {
                    String currentline = line;
                    String[] parts = currentline.split(":");
                    String part1 = parts[0]; 
                    String part2 = parts[1]; 
                    movies.add(new Movie(part1, part2));
                }
            }
            if(line.equals("Shows")) {
                // do something
            }
            if(line.equals("Prices")) {
                // do something
            }
            if(line.equals("Theaters")) {
                // do something
            }
            if(line.equals("...")) {
                // do something
            }
            else if(line.contains(":")) {
                //do something
            }
            else if(line.equals("End")) {
                // do something
            }
            else {
                // anything else
            }
        }
        reader.close();
    }
}

我是BufferedReaders的新手,所以对于更好的方法的任何意见或建议都会受到赞赏。

2 个答案:

答案 0 :(得分:1)

当您在电影下达到第二个while循环时,如果测试您的线仍然等于电影。你没有在if测试中阅读更多行。您实际上是在尝试"Movies".split(":")[1];,这会让您的索引超出范围。

在第二个while循环中到达Movies字符串后,您应该阅读更多行。

if(line.equals("Movies")) {
    while ((line = reader.readLine()) != null && !line.equals("Theaters")) {
        String currentline = line;
        String[] parts = currentline.split(":");
        String part1 = parts[0]; 
        String part2 = parts[1]; 
        movies.add(new Movie(part1, part2));
    }
}

编辑:很多时候处理文件时尤其如果你没有写文件,你可以有尾随空格,额外的新行和各种差异。这就是为什么我建议您使用System.out.println轻松快速地观察您的程序流程。以下是我为此区域设置的方法

if(line.equals("Movies")) {
    System.out.println("Hit Movies");
    while ((line = reader.readLine()) != null && !line.equals("Theaters")) {
       System.out.println("pasing ("+line+")");
        String currentline = line;
        String[] parts = currentline.split(":");
        String part1 = parts[0]; 
        String part2 = parts[1]; 
        movies.add(new Movie(part1, part2));
    }
    System.out.println("Finished Movies");
}

如您所见,我在行输出"pasing ("+line+")"周围加上括号。这让我有点不一致。剧院线上可能有一个尾随空间。您可能正在比较

"Theaters ".equals("Theaters")

您可以通过执行以下操作来解决此问题:!line.trim().equals("Theaters")

尾随空格,区分大小写,隐藏的ASCII字符都是解析世界中的问题。

答案 1 :(得分:0)

while((line = reader.readLine())!= null){

        if(line.equals("Movies")) {

            while (!(line.equals("Theaters"))) {
                String currentline = line;
                String[] parts = currentline.split(":");
                String part1 = parts[0]; 
                String part2 = parts[1]; 
                movies.add(new Movie(part1, part2));
            }
        }

第一行代码,读取一行。第二行,什么都没读。三线没什么。第四行,currentLine = line生成currentLine = Movie因为您之后没有读过任何行。因此,您尝试将Movies与不存在的:分开,以便您可以使用索引0。索引1超出范围。

内部循环也应该读一行

while ((line = reader.readLine()) != null && !(line.equals("Theaters"))) {