Потоковая обработка - поиск файла / dir в заданном каталоге по имени - PullRequest
0 голосов
/ 14 января 2019

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

Суть в том, что я обязан делать это в сферах функционального программирования / потоковой обработки.

Я пытался добиться этого, используя .walk() и .find(), но это не сработало

public static List<File> findFile(Path path, String name) throws IOException{

    return Files.walk(path)
            .filter(n -> n.getFileName().toString().equals(name))
            .map(n -> n.toFile())
            .collect(Collectors.toList());
}

Ответы [ 3 ]

0 голосов
/ 15 января 2019

Вместо этого вы можете использовать Files.list(Path dir)

List<File> listOfFiles = Files.list(Paths.get(path))
                              .filter(e -> e.getFileName().endsWith(name))
                              .map(n -> n.toFile()).collect(Collectors.toList());

Примечание:

Настройте состояние фильтра в соответствии с вашими требованиями. Я предположил, что name имеет значение, подобное .txt, поэтому listOfFiles будет содержать все файлы, заканчивающиеся на .txt

0 голосов
/ 16 января 2019

Метод walk будет работать для вас, но преобразование в файл в начале позволяет использовать метод getName, который возвращает имя File как String

public static List<File> findFile(Path path, String name) throws IOException{
    return Files
        .walk(path)
        .map(Path::toFile)    //.map(p -> p.toFile())
        .filter(File::isFile) //.filter(f -> f.isFile())
        .filter(f -> f.getName().equals(name))
        .collect(Collectors.toList());
}

Обратите внимание, что указанное имя должно совпадать с именем файла (включая его расширение), иначе функция не найдет его

0 голосов
/ 15 января 2019

Проверить этот вопрос

File dir= new File("path");
File[] fileList = dir.listFiles(new FilenameFilter() 
{
    public boolean accept(File dir, String foundFileName) 
   {
        return name.equalsIgnoreCase(foundFileName);
   }
});

Хотя кажется, что вы просто пытаетесь найти один конкретный файл, это не лучший код для этой задачи. В любом случае, ваш файл должен быть в первой позиции массива. Или сделать несколько мерзких dir.listFiles()..[0]

...