文件读取期间无限循环且String.split()无法正常工作

时间:2014-04-02 01:43:19

标签: java string loops file-io split

我有一个文本文件admin.dat,如下所示:

blackranger|sdasdasdasd23123|1000
blueranger|sdasdasdasdwhhh22|1000
brownranger|lppsadospd123|1000

我正在尝试阅读每一行,使用|作为我的分隔符并输出到每个部分的控制台。

代码

package testing;

import java.io.File;
import java.io.FileNotFoundException;
import java.io.IOException;
import java.util.Scanner;

public class Testing {
    public static void main(String[] args) {
        Scanner filereader = null;
        try {
            filereader = new Scanner(new File("./src/testing/players.dat"));
            String data;
            while(filereader.hasNextLine()) {
                String foo = "abc|123|a213";
                String[] bar = foo.split("|");
                for (int i = 0; i < 3; i++) {
                    System.out.println(bar[i]);
                }
            }
        } catch (FileNotFoundException e) {
            System.out.println("File not found");
        } catch (IOException e) {
            System.out.println("Error while reading file");
        } finally {
            if (filereader != null) {
                filereader.close();
            }
        }
    }
}

预期结果

blackranger
sdasdasdasd23123
1000
blueranger
sdasdasdasdwhhh22
1000
brownranger
lppsadosph123
1000

实际结果

a // infinite loop
b


a
b 


a
b


a
b



a
b

为什么我会得到永久打印a b的无限循环?

3 个答案:

答案 0 :(得分:5)

您应该转义字符|,因为它在regex

中具有特殊含义
 foo.split("\\|");

但首先,为foo分配您从文件中读取的值,而不是通过硬编码:

String foo = filereader.nextLine();

答案 1 :(得分:4)

你永远不会从while循环中的fileReader中读取,所以while(filereader.hasNextLine()) 总是 是真的,循环永远不会结束。让我感到惊讶的是,看起来你的代码是从循环内部的fileReader中读取的,但是对它进行了评论。为什么呢?

解决方案:不要这样做。确保在while循环中更改测试条件,否则while循环将永远不会结束。

答案 2 :(得分:2)

String foo = filereader.nextLine();
String[] bar = foo.split("\\|");

而不是

 String foo = "abc|123|a213";
 String[] bar = foo.split("|");