投稿したコードは、最初の行を読んだだけで、その行を永久にループするため、機能していません。
トリミングおよび注釈付きのコード:
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
ます。
元の回答
これは、スキャナーの理想的な使用例です。探しているコンテンツの文字列またはファイルを「スキャン」し、多くのユースケース、特に空白で区切られたファイルのファイル解析を劇的に簡素化します。
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]);
}
}
}
余談ですが、名前が一意であることがわかっている場合は、マップ(具体的にはHashMap)を使用して、名前から数値などのマッピングを効率的に保存および検索できます。したがって、ファイル名と名前を取得して検索するメソッドを使用する代わりに、ファイルを解析してすべての名前の番号へのマッピングを返すメソッドを使用すると、返されたマップを呼び出すだけmap.get("name")
で、特定の人の番号を効率的に取得できます。 、毎回ファイルを再読み込みする必要はありません。