Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Java: Общие вопросы > Быстрый поиск подстроки в файле


Автор: regen 24.7.2006, 11:22
Добрый день
Суть вопроса такова.. Как средствами Java можно усуществить поиск подстроки в файле? В msdos есть команда find. Она именно его и производит. Можно ли из java вызвать эту команду или как осуществить быстрой поиск в файле? Метод считать файл в буффер а потом искать в буффере - не пройдёт.. Файлов очень много в каталоге, и мне необходимо найти файлы в которых есть указанная подстрока...
Заранее спасибо за ответ. 

Автор: batigoal 24.7.2006, 11:38
Без программного чтения реализовать поиск в файле можно только командой оси, как ты и сам сказал. Для запуска команды пользуйся 
Код

Runtime.getRuntime().exec("find ...")

, а потом анализируй в программе вывод команды.

Разумеется, следует еще не забыть о проблеме кросплатформенности, если она нужна. 

Автор: regen 24.7.2006, 12:19
Только что попробовал.. Команда find не может найти русскоязычной подстроки.. Т.е. подстрку "Olga" найти может, а подстроку "Ольга" - нет.. Какие тогда идеи насчёт быстрого поиска? 

Автор: sergejzr 24.7.2006, 12:31
Там всё дело в кодировке. Поиграй с ней.

Добавлено @ 12:33 
На крайний случай - пиши сам. Ищи с Stream'e. Вот тебе алгоритмов сумка smile
http://www-igm.univ-mlv.fr/~lecroq/string/index.html 

Автор: batigoal 24.7.2006, 12:44
Первое, что приходит на ум при решении задачи быстрого поиска - это предварительная индексация. Разумеется, это будет затратной операцией с точки зрения добавления/удаления/изменения индексируемых файлов.  

Автор: tux 24.7.2006, 12:47
Если нужен поиск по текстовым файлам, может быть пойдет такой метод:
Код

public class Find {
    private static final String DEFAULT_CHARSET = "KOI8-R";

    public static void main(String[] args) {
        String dir = "/opt/java/postgres";
        String toSearch = "версия";
        new Find().run(dir, toSearch);
    }

    private void run(String dir, String toSearch) {
        File f = new File(dir);

        if (f.isDirectory())
            doSearch(f, toSearch);
    }

    private void doSearch(File f, String toSearch) {
        File[] files = f.listFiles();

        for (int i = 0; i < files.length; i++) {
            if (files[i].isDirectory())
                doSearch(files[i], toSearch);
            else {
                try {
                    BufferedReader br = new BufferedReader(
                            new InputStreamReader(
                                    new FileInputStream(files[i]),
                                    DEFAULT_CHARSET));

                    int lineNumber = 1;
                    while (true) {
                        String line = br.readLine();
                        if (line == null)
                            break;
                        else {
                            if (line.indexOf(toSearch) >= 0) {
                                System.out.println("File: "
                                        + files[i].getAbsolutePath()
                                        + ", line: " + lineNumber);
                            }
                            lineNumber++;
                        }
                    }
                    br.close();
                } catch (FileNotFoundException e) {
                    e.printStackTrace();
                } catch (IOException e) {
                    e.printStackTrace();
                }
            }
        }
    }

}
 

Автор: sergejzr 24.7.2006, 12:54
Цитата(Lamer George @  24.7.2006,  10:44 Найти цитируемый пост)
Первое, что приходит на ум при решении задачи быстрого поиска - это предварительная индексация. Разумеется, это будет затратной операцией с точки зрения добавления/удаления/изменения индексируемых файлов.  

Я бы посмотрел в сторону http://lucene.apache.org/java/docs/. 
Кстати для линуха (ну и винды тоже) ещё есть http://www.pcwelt.de/downloads/linux/linux/124270/index.html- лучшая альтернатива гугльскому  "Desktop search".
(Моя девушка как раз сейчас разрабатывает возможность поиска и на удалённых раб.столах smile ) 

Автор: regen 24.7.2006, 12:56
Да.. Поиск в текстовых файлах....Открытие всех файлов в каталоге и просмотр их... Это понятно... Другими способов нету? Алгоритмы быстрого поиска я знаю... Вот только это опять же "изобретать велосипед" на мой взгляд... 

Автор: batigoal 24.7.2006, 12:57
Цитата(tux @  24.7.2006,  13:47 Найти цитируемый пост)
Если нужен поиск по текстовым файлам, может быть пойдет такой метод:

Ну это все-таки с чтением при каждом поиске...

Надо решить, что критичнее - время манипуляции с файлами, или время поиска в них. 

Автор: tux 24.7.2006, 13:03
Цитата(Lamer George @  24.7.2006,  17:57 Найти цитируемый пост)
Ну это все-таки с чтением при каждом поиске...

Надо решить, что критичнее - время манипуляции с файлами, или время поиска в них.  

Ну да... Хотя и так не очень долго - по массиву 200 метров - полминуты... В общем ждем автора. 

Автор: regen 24.7.2006, 13:32
Вообщем описываю всю предисторию:
в каталоге около 500 файлов размером в среднем по 3 метра
текстовики...
есть форма поиска...
пользователь вводит туда какую-то строку.. дальше происходит сам поиск

насчёт кроссплатформенности... конечные пользователи представители женского пола которым давно за 30... отсюда следует - только виндоус

насчёт что критичнее.. золотая середина между быстротой поиска (чтобы пользователь не ждал по полминуты перед экраном) и объёмом потребляемой памяти при этом 

Автор: tux 24.7.2006, 13:36
Ну тогда действительно смотри в сторону http://lucene.apache.org/java/docs/. Придется периодически индексировать файлы, зато поиск очень быстрый. 

Автор: regen 24.7.2006, 13:42
Lucene так Lucene.... Хорошо... Разберусь... 
Открыв ссылку увидел что это что-то из семейства апача... Ни о каком веб-сервере речи не может быть... Если что-то не понял - то извиняйте.
И ещё... Lucene индексирует сам файл? Или строки в файлах? И это делается на чьей стороне? (файлы в котором осуществляться поиск будет со временем будут обновляться (закачка с сервера)... пройдёт ли Lucene с этим?) 

Автор: sergejzr 24.7.2006, 13:44
Беагле кстати сам индексирует по мере добавления. Там 2 версии CSharp  и ява. идентичные до этого момента. Т.е индексацию по добавлению может только Шарп (связано с нативными вызовами) 

Автор: tux 24.7.2006, 13:55
Цитата(regen @  24.7.2006,  18:42 Найти цитируемый пост)
Открыв ссылку увидел что это что-то из семейства апача... Ни о каком веб-сервере речи не может быть... 

Apache - это организация, при чем веб-вервер?

Цитата(regen @  24.7.2006,  18:42 Найти цитируемый пост)
Lucene индексирует сам файл? Или строки в файлах?

Номера строк в документах не хранит. Если нужны строки, придется искать что-то другое.   

Автор: regen 24.7.2006, 14:27
Цитата

Apache - это организация, при чем веб-вервер?

ошибку понял... был не прав...

возвращусь к тому же find...
если файлы хранить допустим в шестнадцатеричной форме, то проблемы с русскими символами отпадут.. и find будет работать причём ищет он более-менее быстро... если не прав - поправьте 

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)