Дан ког, как сделать,что бы поиск осуществлялся по содержанию файлов, а не по имени?
Код:
package searchtools;
import java.io.File;
import java.io.FilenameFilter;
import java.util.ArrayList;
import java.util.List;
import java.util.regex.Matcher;
import java.util.regex.Pattern;
public class FileFinder {
//классы для работы с регулярными выражениями
private Pattern p = null;
private Matcher m = null;
//общий размер найденных файлов
private long totalLength = 0;
//общее количество найденных файлов
private long filesNumber = 0;
//общее количество просмотренных директорий
private long directoriesNumber = 0;
//константы для определения объектов, которые нужно найти
private final int FILES = 0;
private final int DIRECTORIES = 1;
private final int ALL = 2;
//список с объектами, которые должны быть уведомлены о состоянии поиска
private List listeners = null;
//используется для остановки поиска
private boolean stop = false;
/** Создает новые экземпляры FileFinder */
public FileFinder() {
}
public List findAll(String startPath) throws Exception {
return find(startPath, "", ALL);
}
public List findAll(String startPath, String mask)
throws Exception {
return find(startPath, mask, ALL);
}
public List findFiles(String startPath)
throws Exception {
return find(startPath, "", FILES);
}
public List findFiles(String startPath, String mask)
throws Exception {
return find(startPath, mask, FILES);
}
public List findDirectories(String startPath)
throws Exception {
return find(startPath, "", DIRECTORIES);
}
public List findDirectories(String startPath, String mask)
throws Exception {
return find(startPath, mask, DIRECTORIES);
}
public long getDirectorySize() {
return totalLength;
}
public long getFilesNumber() {
return filesNumber;
}
public long getDirectoriesNumber() {
return directoriesNumber;
}
private boolean accept(String name) {
//если регулярное выражение не задано...
if(p == null) {
//...значит объект подходит
return true;
}
//создаем Matcher
m = p.matcher(name);
//выполняем проверку
if(m.matches()) {
return true;
}
else {
return false;
}
}
/*
Этот метод выполняет начальные установки поиска.
Затем вызывает метод search для выполнения поиска.
*/
private List find(String startPath, String mask, int objectType)
throws Exception {
//сбрасываем переменную стоп, т.к. она могла быть установлена
//в true после остановки предыдущего поиска
stop = false;
//проверка параметров
if(startPath == null || mask == null) {
throw new Exception("Ошибка: не заданы параметры поиска");
}
File topDirectory = new File(startPath);
if(!topDirectory.exists()) {
throw new Exception("Ошибка: указанный путь не существует");
}
//если задано регулярное выражение, создаем Pattern
if(!mask.equals("")) {
p = Pattern.compile(mask,
Pattern.CASE_INSENSITIVE | Pattern.UNICODE_CASE);
}
//обнуляем все счетчики
filesNumber = 0;
directoriesNumber = 0;
totalLength = 0;
//создаем список результатов
ArrayList res = new ArrayList(100);
//уведомляем все зарегистрированные (с помощью метода addListener)
//объекты о начале поиска
if(listeners != null) {
for(int i = 0; i < listeners.size(); i++) {
((SearchListener)listeners.get(i)).onSearchStart();
}
}
//выполняем поиск
search(topDirectory, res, objectType);
//уведомляем все зарегистрированные (с помощью метода addListener)
//объекты о завершении поиска
if(listeners != null) {
for(int i = 0; i < listeners.size(); i++) {
((SearchListener)listeners.get(i)).onSearchEnd();
}
}
//присваиваем null шаблону, т.к. при следующем вызове find...
//регулярное выражение может быть не задано
p = null;
//возвращаем результат
return res;
}
/*
Этот метод выполняет поиск объектов заданного типа.
Если, в процессе поиска, встречает вложенную директорию
(папку), то рекурсивно вызывает сам себя.
Результаты поиска сохраняются в параметре res.
Текущая директория - topDirectory.
Тип объекта (файл или директория) - objectType.
*/
private void search(File topDirectory, List res, int objectType) {
//если нужно остановить поиск...
if(stop == true) {
//... выходим
return;
}
//уведомляем все зарегистрированные (с помощью метода addListener)
//объекты о состоянии процесса поиска
if(listeners != null) {
for(int i = 0; i < listeners.size(); i++) {
((SearchListener)listeners.get(i)).onSearchProgressChange(
totalLength, filesNumber, directoriesNumber);
}
}
//получаем список всех объектов в текущей директории
File[] list = topDirectory.listFiles();
//просматриваем все объекты по-очереди
for(int i = 0; i < list.length; i++) {
//если это директория (папка)...
if(list[i].isDirectory()) {
//...выполняем проверку на соответствие типу объекта
// и регулярному выражению...
if(objectType != FILES && accept(list[i].getName())) {
//...добавляем текущий объект в список результатов,
//и обновляем значения счетчиков
directoriesNumber++;
res.add(list[i]);
}
//выполняем поиск во вложенных директориях
search(list[i], res, objectType);
}
//если это файл
else {
//...выполняем проверку на соответствие типу объекта
// и регулярному выражению...
if(objectType != DIRECTORIES && accept(list[i].getName())) {
//...добавляем текущий объект в список результатов,
//и обновляем значения счетчиков
filesNumber++;
totalLength += list[i].length();
res.add(list[i]);
}
}
}
}
/**
* Этот метод преденазначен для добавления объекта, который нужно
* уведемлять о состоянии процесса поиска
*/
public void addListener(SearchListener listener) {
//Если список объектов не создан, то создаем его
if(listeners == null) {
//начальный размер устанавливаем равным единице, т.к. во
//многих случаях добавляется только один объект
listeners = new ArrayList(1);
}
//добавляем объект
listeners.add(listener);
}
/**
* Этот метод останавливает процесс поиска
*/
public void stopSearch() {
stop = true;
}
}