java - java - 在文件中搜索字元串,如果找到,就返回該字元串

如何通過txt文件搜索用戶輸入的字元串,然後將該字元串返回到控制台,


public static void main(String[] args) {


 searchforName();


}



 private static void searchForName() throws FileNotFoundException {


 File file = new File("leaders.txt");


 Scanner kb = new Scanner(System.in);


 Scanner input = new Scanner(file);



 System.out.println("Please enter the name you would like to search for:");


 String name = kb.nextLine();



 while(input.hasNextLine()) {


 System.out.println(input.next(name));


 }


}



时间: 作者:

你可以創建單獨的Scanner來逐行讀取文件,並按照這種方式進行匹配。


final Scanner scanner = new Scanner(file);


while (scanner.hasNextLine()) {


 final String lineFromFile = scanner.nextLine();


 if(lineFromFile.contains(name)) { 


 // a match!


 System.out.println("I found" +name+" in file" +file.getName());


 break;


 }


}



作者:

Scanner 速度太慢,可以在750 MB的文件中進行搜索,BufferedReader平均比Scanner快10倍。


package uk.co.planetbeyond.service.test;



import java.io.BufferedReader;


import java.io.BufferedWriter;


import java.io.File;


import java.io.FileInputStream;


import java.io.FileNotFoundException;


import java.io.FileOutputStream;


import java.io.IOException;


import java.io.InputStreamReader;


import java.io.OutputStreamWriter;


import java.util.Date;


import java.util.HashSet;


import java.util.Scanner;



public class SearchTextInFile


{


 public static void main(String[] args) throws IOException


 {


 // First write a file, with large number of entries


 writeFile("/home/aqeel/temp/subscribers_files.csv");



 long scannerSearchMillis = 0;


 long brSearchMillis = 0;



 int iterations = 5;



 // Now search random strings five times, and see the time taken


 for (int i = 0; i < iterations; i++)


 {


 String msisdn = String.valueOf(923000000000l + ((long) (Math.random() * 40000000)));



 System.out.println("ITERATION" + i);


 System.out.print("Search" + msisdn +" using scanner");


 Date d1 = new Date();


 searchUsingScanner("/home/aqeel/temp/subscribers_files.csv", msisdn);


 Date d2 = new Date();



 long millis = (d2.getTime() - d1.getTime());


 scannerSearchMillis += millis;


 System.out.println(" |" + (millis / 1000) +" Seconds");


 System.out.println("==================================================================");


 System.out.print("Search" + msisdn +" using buffered reader");


 d1 = new Date();


 searchUsingBufferedReader("/home/aqeel/temp/subscribers_files.csv", msisdn);


 d2 = new Date();


 millis = d2.getTime() - d1.getTime();


 brSearchMillis += millis;


 System.out.println(" |" + (millis / 1000) +" Seconds");


 System.out.println("==================================================================");


 System.out.println("==================================================================");


 System.out.println("==================================================================");


 System.out.println("==================================================================");


 }



 System.out.println("Average Search time using Scanner" + (scannerSearchMillis / (iterations * 1000.0)) +" Seconds");


 System.out.println("Average Search time using BufferedReader" + (brSearchMillis / (iterations * 1000.0)) +" Seconds");


 }



 public static void writeFile(String path)


 {


 BufferedWriter csvWriter = null;


 HashSet<Integer> additions = new HashSet<Integer>();


 try


 {


 csvWriter = new BufferedWriter(new OutputStreamWriter(new FileOutputStream(path)));



 for (int i = 0; i < 40000000; i++)


 {


 int addition = (int) (Math.random() * 40000000);


 additions.add(addition);



 if (i % 20000 == 0)


 {


 System.out.println("Entries written :" + i +" ------ Unique Entries:" + additions.size());


 csvWriter.flush();


 }



 long msisdn = 923000000000l + addition;


 csvWriter.write(String.valueOf(msisdn) +"|" + String.valueOf((int) (Math.random() * 131)) +"rn");


 }



 csvWriter.flush();



 System.out.println("Unique Entries written :" + additions.size());


 }


 catch (Exception e)


 {


 // TODO Auto-generated catch block


 e.printStackTrace();


 }


 finally


 {


 if (csvWriter != null)


 {


 try


 {


 csvWriter.close();


 }


 catch (IOException e)


 {


 // TODO Auto-generated catch block


 e.printStackTrace();


 }


 }


 }


 }



 public static String searchUsingScanner(String filePath, String searchQuery) throws FileNotFoundException


 {


 searchQuery = searchQuery.trim();


 Scanner scanner = null;


 try


 {


 scanner = new Scanner(new File(filePath));


 while (scanner.hasNextLine())


 {


 String line = scanner.nextLine();


 if (line.contains(searchQuery))


 {


 return line;


 }


 else


 {


 }


 }


 }


 finally


 {


 try


 {


 if (scanner != null)


 scanner.close();


 }


 catch (Exception e)


 {


 System.err.println("Exception while closing scanner" + e.toString());


 }


 }



 return null;


 }



 public static String searchUsingBufferedReader(String filePath, String searchQuery) throws IOException


 {


 searchQuery = searchQuery.trim();


 BufferedReader br = null;



 try


 {


 br = new BufferedReader(new InputStreamReader(new FileInputStream(filePath)));


 String line;


 while ((line = br.readLine()) != null)


 {


 if (line.contains(searchQuery))


 {


 return line;


 }


 else


 {


 }


 }


 }


 finally


 {


 try


 {


 if (br != null)


 br.close();


 }


 catch (Exception e)


 {


 System.err.println("Exception while closing bufferedreader" + e.toString());


 }


 }



 return null;


 }


}



作者:

以下Java 7+解決方案的主要優點。


private static void searchForName() throws IOException {


 System.out.println("Please enter the name you would like to search for:");


 Scanner kb = new Scanner(System.in);


 String name = kb.nextLine();



 List<String> lines = Files.readAllLines(Paths.get("leaders.txt"));


 for (String line : lines) {


 if (line.contains(name)) {


 System.out.println(line);


 }


 }


}



從Java 7開始,try-with-resources語句處理關閉資源,打開文件支持的Scanner如下所示:


try (Scanner scanner = new Scanner("leaders.txt")) {


 // using scanner


}




protected static Optional<String> searchForName(String name) throws IOException {


 try (Stream<String> lines = Files.lines(Paths.get("leaders.txt"))) {


 return lines.filter(line -> line.contains(name)).findFirst();


 }


}



它返回一個Optional,表示可能有空結果,


private static void searchForName() throws IOException {


 System.out.println("Please enter the name you would like to search for:");


 Scanner kb = new Scanner(System.in);


 String name = kb.nextLine();



 Optional<String> result = searchForName(name);


 result.ifPresent(System.out::println);


}



作者:
...