2014-01-21 2 views
0

특정 위치의 파일을 검색하는 코드가 있습니다. 검색을 중지 할 시간을 추가하고 싶습니다. 5000ms에서 검색한다고하면 5000ms 후에 검색을 중지하고 결과를 표시해야합니다. 누구나 최선의 방법을 제안 할 수 있습니까?특정 시간에 검색이 완료됩니다.

public class FileSearch { 

    final private int FOLDER=1,FILE=2,BOTH=3; 
    private Pattern pat; 
    private int filter; 
    private List<String> searchList = new ArrayList<String>(); 
    public void setFilter(int filter) { 
     this.filter = filter; 
    } 

    public void setPat(Pattern pat) { 
     this.pat = pat; 
    } 

    private void findFileNames(File file){ 
     File[] list = file.listFiles(); 
     if (list != null) 
     for (File fil : list) { 
      if (fil.isDirectory()) { 
       findFileNames(fil); 
      } else { 
       matchName(fil.getName()); 
      } 
     } 
    } 
    private void findFolderNames(File file){ 
     File[] list = file.listFiles(); 
     if (list != null) 
     for (File fil : list) { 
      if (fil.isDirectory()) { 
       matchName(fil.getName()); 
       findFolderNames(fil); 
      } 
     } 
    } 
    public void findFile(File file) { 

     switch(this.filter){ 
     case FOLDER: 
      findFolderNames(file); 
      break; 
     case FILE: 
      findFileNames(file); 
      break; 
     case BOTH: 

      File[] list = file.listFiles(); 
      if (list != null) 
      for (File fil : list) { 
       if (fil.isDirectory()) { 
        findFolderNames(fil); 
       } else { 
        matchName(fil.getName()); 
       } 
      } 

      findFileNames(file); 
      findFolderNames(file); 
      break; 
     default: 
      break; 

     } 

    } 

    public void startFileSearch() { 
     FileSearch ff = new FileSearch(); 
     Scanner scan = new Scanner(System.in); 
     System.out.println("Enter the file name to be searched (Can use regular expressions).. "); 
     String name = scan.next(); 
     System.out.println("Enter the directory where to search "); 
     String directory = scan.next(); 
     System.out.println("Enter filter (1.FOLDER/2..FILE/3.BOTH) to search "); 
     int filter = scan.nextInt(); 
     ff.setPat(Pattern.compile(name)); 
     ff.setFilter(filter); 
     ff.findFile(new File(directory)); 
    } 

    private void matchName(String fileName){ 
     if (this.pat.matcher(fileName).find()) { 
      System.out.println(fileName); 
      this.searchList.add(fileName); 
     } 

    } 
} 
+0

필자는'findFile'을 실행하기 위해 새로운'Thread'를 생성하고, 완료되지 않은 경우'thr.interrupt()'를 사용하여 5000ms 후에 스레드를 인터럽트하는 것을 추천 할 것입니다. 그 이유는 내가 진행중이지만 완료되지 않은 경우'listFiles' 연산을 방해 할 것이라고 생각했기 때문입니다. 왜냐하면 각 파일 이름 (또는 가능한 파일 이름 블록)을 검색하는 사이에 인터럽트 체크 포인트가 발생한다고 가정했기 때문입니다. 그러나,'listFiles'에 대한 javadoc은 인터럽트에 대해서는 아무 것도 말하지 않습니다. 'listFiles'가 그런 식으로 중단 될 수 있는지 아는 사람 있습니까? – ajb

+0

수천 개의 파일이있는 거대한 디렉토리를 만날 수 있다면'listFiles'가 오랜 시간이 걸리고 중단되지 않을 수도 있습니다. 이 경우 ['newDirectoryStream'] (http://docs.oracle.com/javase/7/docs/api/java/nio/file/Files.html#newDirectoryStream (java.nio.file) .통로)). (P.S. 나는 이것을 시도하지 않았다.) – ajb

답변

1

Quartz API를 사용하는 것이 좋습니다. 하지만 javas Timer 및 TimerTask API를 사용할 수도 있습니다. 다음 참조를 사용할 수 있습니다. Timer & Timertask

1

두 개 이상의 스레드를 사용해야합니다.

주 스레드는 Runnable을 구현하는 클래스의 인스턴스가있는 검색 스레드를 시작하고 부울 플래그 "stopped"을 가지고 5000ms를 기다린 다음 세 개의 인스턴스를 검색 할 때 "stopped"플래그를 true로 설정합니다. 검색 스레드는 루프에서 "중지됨"플래그를 확인하고 true이면 실행() 메소드를 완료합니다. 스레드를 인터럽트하지 마십시오. Plse 스레드 API를 참조하고 어떻게 대량 만들 수 있습니다. Pls 더 많은 힌트가 필요하면 알려주십시오. Thx

+0

왜 "스레드를 중단하지 않습니까?" Java에서 인터럽트의 영향은 꽤 잘 정의되고 예측 가능하므로 일관성없는 상태로 남아 있으면 안됩니다. 'stopped' 플래그의 문제점은 라이브러리 I/O 루틴이 그것을 검사하지 않을 것이지만 스레드의 인터럽트 상태를 점검 할 수 있다는 것입니다. ('listFiles'가이 상태를 체크하면, 인터럽트가 더 좋은 것 같습니다.) – ajb

+0

@ajb I/O 루틴은 플래그를 체크하지 않을 것입니다. I/O 호출간에 코드로 구현됩니다. 필자의 관점에서 구현하는 것이 더 쉽지만 "정확한"5000ms가 아니라 5000ms + 마지막 IO입니다. 나는 오래된 I/O 루틴이 인터럽트를 무시할 때까지 무시한다고 믿는다. 내가 잘못? – JosefN

+0

내가 틀렸다는 것이 확실하지 않습니다. 일부 I/O 루틴이 중단 될 수 있다고 생각했지만 소켓을 생각하고있을 수도 있습니다. 나는 OP의 상황이 무엇인지 모른다. 'listFiles'가 20,000 개의 파일이있는 디렉토리에서 사용될 수 있다면, 사용하지 말고 대신 newDirectoryStream을 사용해야합니다. 이 경우 각 반복 사이에'stopped' 변수를 검사 할 수 있습니다. – ajb