Создание Java-программы для поиска файла по определенному слову - PullRequest
3 голосов
/ 02 декабря 2010

Я только изучаю этот язык, и мне было интересно, что будет делать опытный Java-программист в следующей ситуации?

Я хотел бы создать Java-программу, которая будет искать в указанном файле все экземпляры дляконкретное слово.

Как бы вы поступили с этим, поставляется ли Java API с классом, обеспечивающим возможности сканирования файлов, или я должен написать свой собственный класс, чтобы сделать это?

Спасибо за любой вклад,
Дом.

Ответы [ 3 ]

6 голосов
/ 02 декабря 2010

Java-API действительно предлагает класс java.util.Scanner, который позволит вам сканировать входной файл.

В зависимости от того, как вы собираетесь использовать это, это может быть не самой лучшей идеей.Файл очень большой?Вы ищете только один файл или пытаетесь сохранить базу данных из множества файлов и искать файлы в этом?В этом случае вы можете использовать более изощренный движок, такой как lucene .

3 голосов
/ 02 декабря 2010

Как уже отмечали другие, вы можете использовать класс Scanner.

Я поместил ваш вопрос в файл data.txt и запустил следующую программу:

import java.io.*;
import java.util.Scanner;
import java.util.regex.MatchResult;

public class Test {
    public static void main(String[] args) throws FileNotFoundException {
        Scanner s = new Scanner(new File("data.txt"));
        while (null != s.findWithinHorizon("(?i)\\bjava\\b", 0)) {
            MatchResult mr = s.match();
            System.out.printf("Word found: %s at index %d to %d.%n", mr.group(),
                    mr.start(), mr.end());
        }
        s.close();
    }
}

Вывод:

Word found: Java at index 74 to 78.
Word found: java at index 153 to 157.
Word found: Java at index 279 to 283.

Поиск шаблона, (?i)\bjava\b, означает следующее:

  • (?i) включить переключатель без учета регистра
  • \b означает границу слова
  • java - искомая строка
  • \b слово ограничено снова.

Если поисковый термин исходит от пользователя или если по какой-либо другой причине он может содержать специальные символы, я предлагаю вам использовать \Q и \E вокруг строки, так как в ней указаны все символы между ними (и если вы действительно разборчивы, убедитесь, что ввод не содержит \E).

3 голосов
/ 02 декабря 2010

Если файл не очень большой, я бы

String text = IOUtils.toString(new FileReader(filename));
boolean foundWord = text.matches("\\b" + word+ "\\b");

Чтобы найти весь текст между вашим словом, вы можете использовать split () и использовать длину строк для определения позиции.

...