package FutureTest; import java.io.File; import java.io.FileInputStream; import java.io.IOException; import java.util.ArrayList; import java.util.Scanner; import java.util.concurrent.Callable; import java.util.concurrent.ExecutionException; import java.util.concurrent.Future; import java.util.concurrent.FutureTask; public class MatchCounter implements Callable<Integer> { /** * Constructor MatchCounter * @param directory Catalog, de unde se incepe cautarea * @param keyword Cuvintul cheie */ public MatchCounter(File directory, String keyword) { this.directory= directory; this.keyword = keyword; } @Override public Integer call() throws Exception { count = 0; try { File[] files = directory.listFiles(); ArrayList<Future<Integer>> results = new ArrayList<Future<Integer>>(); for(File file :files) { if(file.isDirectory()) { MatchCounter counter = new MatchCounter(file, keyword); FutureTask<Integer> task = new FutureTask<Integer>(counter); results.add(task); Thread t = new Thread(task); t.start(); } else { if(search(file)) count++; } for(Future<Integer> result : results) { try { count +=result.get(); } catch (ExecutionException e) { e.printStackTrace(); } } } } catch (InterruptedException e) {} return count; } /** * Cautarea dupa keyWord, in fisier * @param file Fisier, in care facem cautarea * @return true, daca fisierul conOtine keyword */ public boolean search(File file) { try { Scanner in = new Scanner(new FileInputStream(file)); boolean found = false; while(!found && in.hasNextLine()) { String line = in.nextLine(); if(line.contains(keyword)) found = true; } in.close(); return found; }catch (IOException e) { return false; } } private File directory; private String keyword; private int count; }