您发布的代码不起作用,因为您只阅读了第一行,然后永远循环该行。
您的代码,修剪和注释:
String line= br.readLine(); // returns the first line of the file
while(line !=null) { // checks if the line is null - it's not at the first line
a= line.split(" "); // deliminator white space
}
// we never get here, because nowhere in the loop do we set line to null
您需要br.readLine()
在循环中调用,直到它返回 null,如下所示:
BufferedReader br=new BufferedReader(new FileReader(fName));
String line= br.readLine(); // reads the first line, or nothing
while(line != null) {
a= line.split(" "); // deliminator white space
String[] arr = line.split("\\s+"); // splits a string by any amount of whitespace
if(arr.length >= 2 && arr[0].equals(lookup)) {
System.out.println(arr[1]);
}
line = br.readLine(); // this will eventually set line to null, terminating the loop
}
原始代码中的 for 循环将不起作用,如果您点击它,您的输出将分别为lee1
或rodney1
。如果您将其更改为arr[i+1]
,我假设您正在尝试这样做,如果数组中的最后一个项目匹配,它将因 IndexOutOfBoundsException 而崩溃pname
。
原始答案
这是Scanner的理想用例。它“扫描”字符串或文件以查找您要查找的内容,极大地简化了许多用例的文件解析,特别是空格分隔的文件。
public void searchFile(String fName, String lookup){
Scanner in = new Scanner(new File(fName));
// Assumes the file has two "words" per line
while(in.hasNext()){
String name = in.next();
String number = in.next():
if(name.equals(lookup){
System.out.println(number);
}
}
}
如果您不能使用扫描仪来解析每一行,您仍然可以使用它来简化读取每一行,然后对需要完成的行进行任何更复杂的解析,如下所示:
public void searchFile2(String fName, String lookup){
Scanner in = new Scanner(new File(fName));
while(in.hasNextLine()){
String line = in.nextLine();
String[] arr = line.split("\\s+"); // splits a string by any amount of whitespace
if(arr[0].equals(lookup)){
System.out.println(arr[1]);
}
}
}
顺便说一句,如果您知道名称将是唯一的,则可以使用Map(特别是HashMap)来有效地存储和查找名称到数字的映射。因此,您可以使用解析文件并返回所有名称到数字的映射的方法,而不是使用获取文件名和名称来查找的方法,然后您可以简单地调用map.get("name")
返回的映射来有效地获取给定人员的号码,而不必每次都重新读取文件。