Sphinx
Sphinx

Reputation: 1

Are these two ways of creating files, the same?

I was writing a program in Java to search for a piece of text

I took these 3 as inputs

  1. The directory, from where the search should start
  2. The text to be searched for
  3. Should the search must be recursive (to or not to include the directories inside a directory)

Here is my code

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);
            }
        }   
    } 
}

When recursion is set true, the program returns a FILENOTFOUNDEXCEPTION

So, I referred to the site from where I got the idea to implement this program and edited my program a bit. This is how it goes

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);
            }
        }   
    } 
}

It worked perfectly then. The only difference between the two snippets is the way of creating the files, but they look the same to me!!

Can anyone point me out where I messed up?

Upvotes: 0

Views: 122

Answers (3)

Peter Lawrey
Peter Lawrey

Reputation: 533500

You need to include the base directory when you build the File object as @fivedigit points out.

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

I would close your files when you are finished and I would avoid using throws Exception.

Upvotes: -1

fivedigit
fivedigit

Reputation: 18682

The problem in the first example is in the fact that file.list() returns an array of file NAMES, not paths. If you want to fix it, simply pass file as an argument when creating the file, so that it's used as the parent file:

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

Now it assumes that anotherFile is in the directory represented by file, which should work.

Upvotes: 1

xyz
xyz

Reputation: 201

In the second example it is used listFiles() whichs returns files. In your example it is used list() which returns only the names of the files - here the error.

Upvotes: 1

Related Questions