2016-11-20 4 views
0

То, что я пытаюсь достичь, это в основном файл Java, который просматривает конкретный каталог на компьютере пользователя, ищет все файлы в каталоге для определенного слова (в этом случае электронное письмо), а затем в конце распечатать их.Чтение нескольких файлов в каталоге и печать определенного содержимого

Текущий скрипт, который у меня есть, ищет все файлы в определенном каталоге, распечатывает эти имена файлов. Кроме того, я также выяснил, как выполнить поиск этого сценария через один файл для определенного слова, а затем распечатать его. Единственная проблема заключается в том, что, хотя он ищет через этот один файл и получает это слово/фразу, ему нужно предоставить полный каталог и файл для работы. Я просто хочу, чтобы у него был определенный каталог, а затем поиск всех файлов в нем. Я попытался сделать это, используя переменную каталога, которую я создал, чтобы найти все файлы, но она не работает при использовании этого в качестве каталога файлов для поиска, чтобы найти слово (ы).

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

package aProject; 

import java.io.BufferedReader; 
import java.io.File; 
import java.io.FileReader; 
import java.io.IOException; 

public class aScanner { 

    static String usernameMac = System.getProperty("user.name"); 
    final static File foldersMac = new File("/Users/" + usernameMac + "/Library/Mail/V2"); // this is the right directory I want to look through 

    public static void listFilesForFolder(final File foldersMac) { 
     for (final File fileEntry : foldersMac.listFiles()) { 

      if (fileEntry.isDirectory()) { 
       listFilesForFolder(fileEntry); 

       try { 
        BufferedReader bReaderM = new BufferedReader(new FileReader("/Users/username/Library/Mail/V2/AosIMAP-/INBOX.mbox/longnumber-folder/Data/Messages/1.emlx")); //this is where I would like the foldersMac variable to work in, instead of this full directory 
        String lineMe; 
        while((lineMe = bReaderM.readLine()) != null) 
        { 
         if(lineMe.contains(".com")) 
          System.out.println(lineMe); 
        } 
        bReaderM.close(); 
       } 
       catch (IOException e) { 

       } 

      } else { 
       System.out.println(fileEntry.getName()); 

      } 

     } 
    } 

    } 
+1

Не забудьте закрыть этот читатель, в случае, если есть аз IOException или любое другое поведение. Я бы предпочел применить этот метод .close() внутри блока finally. – JSONStatham

ответ

0

Я думаю, что это то, что вы пытаетесь достичь:

import java.io.BufferedReader; 
import java.io.File; 
import java.io.FileReader; 
import java.io.IOException; 
import java.util.ArrayList; 

public class aScanner { 

    static String usernameMac = System.getProperty("user.name"); 
    final static File foldersMac = new File("/Users/" + usernameMac + "/Library/Mail/V2"); 

    public static void main(String[] args) throws IOException { 
     listFilesForFolder(foldersMac); 
    } 

    public static void listFilesForFolder(final File foldersMac) throws IOException { 
     for (final File fileEntry : foldersMac.listFiles()) { 
      if (fileEntry.isDirectory()) { 
       listFilesForFolder(fileEntry); 
      } else { 
       ArrayList<String> lines = new ArrayList<>(); 
       try (BufferedReader bReaderM = new BufferedReader(new FileReader(fileEntry))) { 
        String lineMe; 
        while ((lineMe = bReaderM.readLine()) != null) { 
         if (lineMe.contains(".com")) { 
          lines.add(lineMe); 
         } 
        } 
       } 
       if (!lines.isEmpty()) { 
        System.out.println(fileEntry.getAbsolutePath() + ":"); 
        for (String line : lines) { 
         System.out.println(" " + line.trim()); 
        } 
       } 
      } 
     } 
    } 
} 
+0

Я ценю, что вы нашли время, чтобы написать код, я попытался реализовать его в своем коде. Но это дает мне кучу ошибок, я знаю, что я, конечно, должен импортировать все подключаемые модули, которые я сделал. Но он по-прежнему дает мне разные ошибки, которые я не могу исправить. Если вы поместите код в https://www.compilejava.net/, он также даст кучу ошибок. Это одна из ошибок, которые я получил в Eclipse 'не может создать экземпляр типа ArrayList ' –

+0

Я отредактировал и добавил необходимый импорт. Он не будет запускаться в compilejava.net, потому что песочница не позволит доступ к свойствам системы или файловой системе, но она компилируется. – teppic

0

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

if (fileEntry.isDirectory()) { 
       listFilesForFolder(fileEntry); 

... 
} 

Закройте это утверждение if раньше, тогда оно должно работать.

+0

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