所以我试图从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
答案 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();
}
}
}