簡體   English   中英

如何在緩沖讀取器中執行復雜的操作(循環)?

[英]How to perform complex operations (loops) within a buffered reader?

我試圖通過從文本文件中讀取數據來初始化類字段。 示例文本文件如下所示:

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。

在這段代碼中,我試圖將文件“電影”類別下的行解析為一個類字段,該類字段是電影的數組列表。 一種

電影具有字段Name(String)和Length(String)。 我通過在行中使用分隔符“:”來拆分行來嘗試此操作(拆分影片名稱和長度編號)。

    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的新手,因此希望提供任何關於更好方法的輸入或建議。

當您到達電影下的第二while循環時,如果測試,您的行數仍等於電影。 您將無法再讀取if測試中的更多行。 您實際上是在嘗試制作"Movies".split(":")[1]; 這使您的索引越界越好。

在第2個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字符都是解析世界中的陷阱。

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 ,該Movies不存在,因此您可以使用索引0。 索引1超出范圍。

內部循環也應該讀一行

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

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM