특정 위치의 파일을 검색하는 코드가 있습니다. 검색을 중지 할 시간을 추가하고 싶습니다. 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);
}
}
}
필자는'findFile'을 실행하기 위해 새로운'Thread'를 생성하고, 완료되지 않은 경우'thr.interrupt()'를 사용하여 5000ms 후에 스레드를 인터럽트하는 것을 추천 할 것입니다. 그 이유는 내가 진행중이지만 완료되지 않은 경우'listFiles' 연산을 방해 할 것이라고 생각했기 때문입니다. 왜냐하면 각 파일 이름 (또는 가능한 파일 이름 블록)을 검색하는 사이에 인터럽트 체크 포인트가 발생한다고 가정했기 때문입니다. 그러나,'listFiles'에 대한 javadoc은 인터럽트에 대해서는 아무 것도 말하지 않습니다. 'listFiles'가 그런 식으로 중단 될 수 있는지 아는 사람 있습니까? – ajb
수천 개의 파일이있는 거대한 디렉토리를 만날 수 있다면'listFiles'가 오랜 시간이 걸리고 중단되지 않을 수도 있습니다. 이 경우 ['newDirectoryStream'] (http://docs.oracle.com/javase/7/docs/api/java/nio/file/Files.html#newDirectoryStream (java.nio.file) .통로)). (P.S. 나는 이것을 시도하지 않았다.) – ajb