Как создать новую тему каждый раз, когда поиск в каталоге Java - PullRequest
0 голосов
/ 10 октября 2018

У меня есть следующий код:

 public void searchStringInFile(String directory, String word)
    {
        if (word != null && directory != null)
        {

            File filePath = new File(directory);
            Queue<File> queue = new LinkedList<>();
            queue.add(filePath);

            while (!queue.isEmpty())
            {
                File currentFile = queue.poll();
                File[] listOfDirectories = currentFile.listFiles();

                if (listOfDirectories != null)
                {
                    for (File file : listOfDirectories)
                    {
                        if (file.isDirectory())
                        {
                            queue.add(file);
                        }
                        else
                        {
                            Thread thread = new Thread(new Runnable()
                            {

                                @Override
                                public void run()
                                {
                                    readText(file, word);

                                }
                            });
                            thread.start();
                        }
                    }
                }
            }

        }
    }


    private void readText(File file, String word)
    {
        Scanner scan = null;
        try
        {

            scan = new Scanner(file);
            String line;
            int lineNumber = 0;
            while (scan.hasNextLine())
            {
                line = scan.nextLine();
                lineNumber++;
                if (line.contains(word))
                {
                    System.out.println("Line: " + lineNumber + " contains the word: " + word + "  at file: " + file.getAbsolutePath());
                }
            }

        }
        catch (FileNotFoundException e)
        {
            e.printStackTrace();
        }
        finally
        {
            close(scan);
        }

Он находит String(word) во всех файлах в каталогах и подкаталогах.Я хочу сделать его многопоточным приложением - когда он входит в каталог (или обнаруживается), он должен запустить new Thread и начать поиск в файлах, и я не знаю, как это сделать на самом деле.Я делаю это, как в приведенном выше коде, чтобы запускать new Thread каждый раз, когда он открывает файл, но это должно быть, когда он входит в каталог.

1 Ответ

0 голосов
/ 10 октября 2018

Если я правильно понял ваш вопрос и вы хотите запустить свой поток за циклом, вы можете сделать это следующим образом:

 public void searchStringInFile(String directory, String word){
    if (word == null || directory == null) {
        return;
    }

    File filePath = new File(directory);
    Queue<File> queue = new ConcurrentLinkedQueue<>();
    queue.add(filePath);

    while (!queue.isEmpty()) {
        File currentFile = queue.poll();
        File[] listOfDirectories = currentFile.listFiles();

        if (listOfDirectories != null)
        {
            new Thread(() -> {
                for (File file : listOfDirectories)
                {
                    if (file.isDirectory()) {
                        queue.add(file);
                    } else {
                       readText(file, word);
                    }
                }
            }).start();

        }
    }
}

Вам нужно изменить свою очередь на ConcurrentLinkedQueue, которая является поточно-безопасной реализацией,потому что теперь у вас есть несколько потоков, одновременно меняющих очередь.

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