[英]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.