2013-03-22 139 views
4

如何通過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)); 
    } 
} 

的「leaders.txt」文件包含名稱的列表。

+4

您需要遍歷文件中的每一行(**,同時它有任何**)並檢查每行中的字符串。 – 2013-03-22 18:46:21

+0

您是否在尋找這一行的一些特殊數據?您可以將文件讀取爲單個字符串(如果它不是太大) - 例如,使用apache常見的fileutils。 – evgenyl 2013-03-22 18:50:20

回答

8

您可以創建一個單獨的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; 
    } 
} 

至於你是否應該使用ScannerBufferedReader讀取該文件,讀這answer

+0

你爲什麼讓那些「最終」?我知道最後的結果會讓他們在更晚的時候不能改變,但我想知道是否有必要或只是我應該養成這樣做的習慣。 – lancer 2013-03-22 18:56:29

+0

這是一種習慣 - 也是一種好習慣。閱讀有效的Java – 2013-03-22 18:59:34

1

掃描儀太慢了。運行以下代碼,並查看差異。以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)) + "\r\n"); 
      } 

      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; 
    } 
} 
相關問題