FileReader не будет читать второй файл в списке - PullRequest
0 голосов
/ 27 мая 2018

Я поместил два файла в каталог и проверил, может ли мой код найти файлы и найти совпадение, но FileReader не будет читать второй файл.Вот мой код и моя консольная запись.Я сузил ошибку до FileReader, но я не знаю, как это исправить.

public class Main 
{
  public static void searchEngine(String dir, String Search) 
  {
    File folder = new File(dir);
    String[] files = folder.list();
    Integer f1 = 0;
    FileReader fileReader;
    ArrayList linematches;
    BufferedReader bufferedReader;
    Integer q;
    String line;
    Integer linenum;

    System.out.println("Found Files:");
    for (String file : files) {
        System.out.println(file);
    }
    try {
        for (String file : files) {
            linematches = new ArrayList();
            fileReader = new FileReader(files[f1]);
            bufferedReader = new BufferedReader(fileReader);
            linenum = 0;
            while ((line = bufferedReader.readLine()) != null) {
                linenum += 1;
                if (line.contains(Search)) {
                    linematches.add(linenum);
                }
            }
            q = 0;
            for (int i = 0; i < linematches.size(); i++) {
                System.out.println("File: " + file + "  Line: " + linematches.get(i));
            }
            linematches.removeAll(linematches);
            // Always close files.
            bufferedReader.close();
            f1++;
        }
    } catch (FileNotFoundException ex) {
        System.out.println("Unable to open file '" + dir + "'");
    } catch (IOException ex) {
        System.out.println("Error reading file '" + dir + "'");
    }
  }

  public static void main(String[] args) 
  {
    while (true) {
        System.out.println("Enter the search term: ");
        Scanner scanner = new Scanner(System.in);
        String searchterm = scanner.nextLine();
        System.out.println("Enter each file location: ");
        String f1 = scanner.nextLine();
        searchEngine(f1, searchterm);
    }
  }
}

Вот вывод моей консоли:

Enter the search term: 
bla
Enter each file location: 
test dir
Found Files:
testfile.txt
testfile2.txt
Unable to open file 'test dir'

Трассировка всей ошибки:

Невозможно открыть файл 'testfile2.txt' java.io.FileNotFoundException:
testfile2.txt (Нет такого файла или каталога) Введите условие поиска:в
java.io.FileInputStream.open0 (собственный метод) в
java.io.FileInputStream.open (FileInputStream.java:195) в
java.io.FileInputStream. (FileInputStream.java:138)в
java.io.FileInputStream. (FileInputStream.java:93) в
java.io.FileReader. (FileReader.java:58) в
com.mangodev.Main.searchEngine (Main.java:32) at
com.mangodev.Main.main (Main.java:70)

Пожалуйста, помогите.Спасибо.

Ответы [ 2 ]

0 голосов
/ 27 мая 2018

В первой строке метода searchEngine вы создаете переменную folder, которая содержит файлы в каталоге.Я предлагаю использовать эту переменную непосредственно в вашем цикле for вместо строковых имен файлов.

for (File file : folder.listFiles()) {
    linematches = new ArrayList();
    fileReader = new FileReader(file);
    bufferedReader = new BufferedReader(fileReader);
    //rest of code...
}
0 голосов
/ 27 мая 2018

Мне кажется, у вас следующая структура папок:

Main.class
Main.java
test dir
|-- testfile.txt
|-- testfile2.txt

Вы запускаете код из каталога, содержащего Main.class, Main.java и test dir.Ваш код затем перечисляет файлы в каталоге test dir, находя два текстовых файла, которые он содержит, но затем пытается открыть их из текущего каталога .Это родительский каталог, и, конечно, это не то место, где находятся эти файлы.Они находятся в подкаталоге test dir.Таким образом, следует ожидать FileNotFoundException: вы пытаетесь открыть файл в неправильном каталоге.

Если сбой FileReader обнаружен во втором из двух файлов, существует ли файл?testfile.txt также в родительском каталоге?Возможно, ваш код впервые открывал этот файл в цикле, а не в том, что вы в test dir считали.

Чтобы открыть файлы в подкаталоге test dir, замените строку

        fileReader = new FileReader(files[f1]);

с

        fileReader = new FileReader(new File(dir, files[f1]));
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...