为什么文本文件不能完整读取?

时间:2014-04-02 09:52:35

标签: java java.util.scanner

所以我试图从txtfile中提取一段代码,片段的开头由“#EMPIRES”表示,而结尾由另一个以'#'开头的字符串表示。然而,我的程序从未找到该作品的开头并继续前进,直到它到达文件的末尾。

试图找出问题所在,我先尝试打印它找到的每一行。 在这里我遇到了另一个问题。很久以前,我的代码已停止查找新行 甚至达到了“#EMPIRES”。

    public String getEmpirestxt(String fileName) {
    Scanner sc;
    try {
        sc = new Scanner(new File(fileName));
        String currentLine = sc.nextLine();
        StringBuilder empiresText = new StringBuilder(currentLine);
        while (!currentLine.startsWith("# EMPIRES")) {
            currentLine = sc.nextLine();
            System.out.println(currentLine);
        }
        currentLine = sc.nextLine();
        while (sc.hasNextLine() && currentLine.charAt(0)!='#') {
            empiresText.append("\n").append(sc.nextLine());
        }
        return empiresText.toString();
    } catch (FileNotFoundException ex) {
        System.out.println("Landed_Titles.txt not found.");
    }
    return null;
}

文本文件本身: https://www.wetransfer.com/downloads/a1093792d5ac54b6ccce04afecb9357f20140402095042/505fca

5 个答案:

答案 0 :(得分:1)

String currentLine = sc.nextLine();

你开始从下一行开始阅读。

答案 1 :(得分:1)

这是我解决您问题的方法。我使用newBufferedReader而不是Scanner来读取文件。此示例适用于Java 7。

public String getEmpirestxt2(String fileName) {
    Charset charset = Charset.forName("ISO-8859-1");
    Path filePath = Paths.get(fileName);
    try (BufferedReader reader = Files.newBufferedReader(filePath, charset)) {
        String line = null;

        // find the start of the piece
        while ((line = reader.readLine()) != null && !line.equals(START)) {
        }
        System.out.println("START: " + line);

        // getting the piece
        StringBuilder sb = new StringBuilder();
        while ((line = reader.readLine()) != null && !line.startsWith(END)) {
            sb.append(line);
        }
        System.out.println("END: " + line);

        return sb.toString();
    } catch (IOException x) {
        System.err.format("IOException: %s%n", x);
    }
    return null;
}

方法中的常量是:

private static final String START = "# EMPIRES";
private static final String END = "#";

我用你的文件测试它,它工作正常。它还打印所需部分的起点和终点:

START: # EMPIRES
END: #      color={ 144 80 60 }

答案 2 :(得分:0)

条件:

while (sc.hasNextLine() && currentLine.charAt(0)!='#')
由于第二个谓词,即使文件有更多行要读取,

也可能终止。如果currentLine.charAt(0)!='#'fales,则while循环结束。这并不意味着没有更多的行可供阅读。

答案 3 :(得分:0)

在你的第二个while循环中,你从未设置currentLine

这部分:

currentLine = sc.nextLine();
 while (sc.hasNextLine() && currentLine.charAt(0)!='#') {
     empiresText.append("\n").append(sc.nextLine());
 }

应该是:

do{
    currentLine=sc.nextLine();
    empiresText.append("\n").append(sc.nextLine());
}while(sc.hasNextLine() && currentLine.charAt(0)!='#');

否则,#EMPIRES之后的行将不会被读取,而while循环的代码将永远不会停止,因为currentLine没有得到更新。

答案 4 :(得分:0)

在第二个while循环中追加currentLine而不是sc.nextLine():

while (sc.hasNextLine() && currentLine.charAt(0) != '#') {
    empiresText.append("\n").append(currentLine);
    currentLine = sc.nextLine();
}

否则你可以使用如下的单个循环:

while (sc.hasNextLine()){
    if(sc.nextLine().startsWith("# EMPIRES")){
        currentLine = sc.nextLine();
        while (sc.hasNextLine() && currentLine.charAt(0) != '#') {
            empiresText.append("\n").append(currentLine);
            currentLine = sc.nextLine();
        }
    }
}