Являются ли эти два способа создания файлов одинаковыми? - PullRequest
0 голосов
/ 10 января 2012

Я писал программу на Java для поиска фрагмента текста

Я взял эти 3 в качестве входных данных

  1. Каталог, откуда должен начинаться поиск
  2. Текст для поиска
  3. Если поиск должен быть рекурсивным (включать или не включать каталоги внутри каталога)

Вот мой код

public void theRealSearch(String dirToSearch, String txtToSearch, boolean isRecursive) throws Exception
{
    File file = new File(dirToSearch);
    String[] fileNames = file.list();
    for(int j=0; j<fileNames.length; j++)
    {
        File anotherFile = new File(fileNames[j]);
        if(anotherFile.isDirectory())
        {
            if(isRecursive)
                theRealSearch(anotherFile.getAbsolutePath(), txtToSearch, isRecursive);
        }       
        else
        {
            BufferedReader bufReader = new BufferedReader(new FileReader(anotherFile));
            String line = "";
            int lineCount = 0;
            while((line = bufReader.readLine()) != null)
            {
                lineCount++;
                if(line.toLowerCase().contains(txtToSearch.toLowerCase()))
                    System.out.println("File found. " + anotherFile.getAbsolutePath() + " at line number " + lineCount);
            }
        }   
    } 
}

Когда для рекурсии установлено значение true, программа возвращает FILENOTFOUNDEXCEPTION

Итак, я обратился к сайту, откуда пришла идея реализовать эту программу, и немного отредактировал свою программу.Вот как это происходит

public void theRealSearch(String dirToSearch, String txtToSearch, boolean isRecursive) throws Exception
{
    File[] files = new File(dirToSearch).listFiles();
    for(int j=0; j<files.length; j++)
    {
        File anotherFile = files[j];
        if(anotherFile.isDirectory())
        {
            if(isRecursive)
                theRealSearch(anotherFile.getAbsolutePath(), txtToSearch, isRecursive);
        }       
        else
        {
            BufferedReader bufReader = new BufferedReader(new FileReader(anotherFile));
            String line = "";
            int lineCount = 0;
            while((line = bufReader.readLine()) != null)
            {
                lineCount++;
                if(line.toLowerCase().contains(txtToSearch.toLowerCase()))
                    System.out.println("File found. " + anotherFile.getAbsolutePath() + " at line number " + lineCount);
            }
        }   
    } 
}

Тогда все работало идеально.Единственное различие между двумя фрагментами - это способ создания файлов, но они выглядят одинаково для меня !!

Может кто-нибудь указать мне, где я испортил?

Ответы [ 3 ]

1 голос
/ 10 января 2012

Во втором примере используется listFiles (), который возвращает файлы. В вашем примере используется list (), который возвращает только имена файлов - здесь ошибка.

1 голос
/ 10 января 2012

Проблема в первом примере заключается в том, что file.list() возвращает массив файлов NAMES, а не путей.Если вы хотите исправить это, просто передайте file в качестве аргумента при создании файла, чтобы он использовался в качестве родительского файла:

File anotherFile = new File(file, fileNames[j]);

Теперь предполагается, что anotherFile находится в представленном каталогена file, что должно сработать.

0 голосов
/ 10 января 2012

Вам нужно включить базовый каталог, когда вы создаете объект File, как указывает @fivedigit.

File dir = new File(dirToSearch);
for(String fileName : file.list()) {
    File anotherDirAndFile = new File(dir, fileName);

Я бы закрыл ваши файлы, когда вы закончите, и я бы избегал использования throws Exception.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...