Как найти файлы в каталоге, зная часть имени

У меня проблема, у меня есть этот каталог с файлами 1k+ и некоторыми папками. Мне нужно найти путь к файлам (которые находятся в подкаталогах), которые начинаются с «BCM», но не только к первому, который я нахожу, но и ко всем файлам, которые начинаются с этого.

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


File dir = new File("K:\\Jgencs");
        FilenameFilter filter = new FilenameFilter() 
        {
         public boolean accept (File dir, String name) 
         { 
            return name.startsWith("BCM");
         }      
        }; 

        String[] children = dir.list(filter);
        if (children == null)
        {
            System.out.println("No directory found"); 
        } 
        else 
        { 
            for (int i = 0; i< children.length; i++) 
            {
                String filename = children[i];
                    System.out.println(filename);
                    File h = new File(dir,filename);
                    System.out.println(h.getAbsolutePath()

Эти файлы находятся в самом каталоге или в подкаталогах? Если они находятся в подкаталогах, вам нужно будет использовать FileFilter, чтобы принять любой каталог или файл, который начинается с BCM. Если они находятся в самом каталоге, тогда FilenameFilter в порядке.

Thomas 12.06.2019 17:14

что вы подразумеваете под "тот, что в netbeans"?

jhamon 12.06.2019 17:14

Добро пожаловать в Stack Overflow! Пожалуйста, прочтите "Как создать минимальный воспроизводимый пример". Затем используйте ссылку редактировать, чтобы улучшить свой вопрос (не добавляйте дополнительную информацию через комментарии). В противном случае мы не сможем ответить на ваш вопрос и помочь вам.

GhostCat 12.06.2019 17:15

Не используйте File h = new File(filename);, потому что это создаст ссылку на файл в текущем каталоге. Вместо этого либо используйте File h = new File(dir, filename);, либо dir.listFiles(filter), чтобы получить массив File[], а не просто массив имен файлов.

Thomas 12.06.2019 17:16

Добро пожаловать @Shiro, я только что опубликовал ответ о том, как этого добиться с помощью библиотеки commons-io.

Brother 12.06.2019 17:28

@Shiro, обновил ответ с помощью простой Java и проверки подкаталогов.

Brother 13.06.2019 12:06
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
В компьютерном программировании биты играют важнейшую роль в представлении и манипулировании данными на двоичном уровне. Побитовые операции...
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Приходилось ли вам сталкиваться с требованиями, в которых вас могли попросить поднять тревогу или выдать ошибку, когда метод Java занимает больше...
Полный курс Java для разработчиков веб-сайтов и приложений
Полный курс Java для разработчиков веб-сайтов и приложений
Получите сертификат Java Web и Application Developer, используя наш курс.
1
6
600
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 2

Ответ принят как подходящий

[ОБНОВЛЕНО] Вот как вы можете использовать простую Java и фильтровать текст из переменной, передаваемой в качестве параметра:

Вот мой каталог: /tmp

Directory structure

И вот работает код:

import java.io.File;
import java.io.FileFilter;
import java.io.IOException;
import java.util.ArrayList;
import java.util.List;

public class GetAllFilesInDirectory {

    public static void main(String[] args) throws IOException {

        String filter = "BCM";

        List<File> files = listFiles("/tmp", new CustomerFileFilter(filter));
        for (File file : files) {
            System.out.println("file: " + file.getCanonicalPath());
        }
    }

    private static List<File> listFiles(String directoryName, CustomerFileFilter fileFilter) {
        File directory = new File(directoryName);
        List<File> files = new ArrayList<>();

        // Get all files from a directory.
        File[] fList = directory.listFiles(fileFilter);
        if (fList != null) {
            for (File file : fList) {
                if (file.isFile()) {
                    files.add(file);
                } else if (file.isDirectory()) {
                    files.addAll(listFiles(file.getAbsolutePath(), fileFilter));
                }
            }
        }
        return files;
    }
}

class CustomerFileFilter implements FileFilter {

    private final String filterStartingWith;

    public CustomerFileFilter(String filterStartingWith) {
        this.filterStartingWith = filterStartingWith;
    }
    @Override
    public boolean accept(File file) {
        return file.isDirectory() || file.isFile() && file.getName().startsWith(filterStartingWith);
    }
}

Это результат:

file: /private/tmp/BCM01.txt
file: /private/tmp/BCM01
file: /private/tmp/subfolder1/BCM02.txt

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

Обратите внимание, что BCM01 — это файл (а не каталог), просто он не имеет расширения.

Brother 12.06.2019 17:27

Я пробую ваш код, но я не знаю, как импортировать библиотеку в netbeans

Shiro Best Loli 13.06.2019 09:34

Привет @ShiroBestLoli, твой проект - maven или gradle? Или это обычная джава?

Brother 13.06.2019 10:26

это простая Java, начал программировать 4 месяца назад, так что я все еще на уровне "новичок"

Shiro Best Loli 13.06.2019 10:38

Привет @ShiroBestLoli. Я обновил ответ примером Plain Java.

Brother 13.06.2019 11:53

Это также относится к подкаталогам для извлечения файлов.

Brother 13.06.2019 12:05

Есть ли способ установить «bcm» с помощью переменной из другого класса?

Shiro Best Loli 13.06.2019 12:58

Вы хотите Файлы.walk:

try (Stream<Path> files = Files.walk(Paths.get("K:\\Jgencs"))) {
    files.filter(f -> f.getFileName().toString().startsWith("BCM")).forEach(
        file -> System.out.println(file));
}

Пробовал использовать это, но он просматривает только файлы в каталоге, а не каждый файл (подкаталоги).

Shiro Best Loli 13.06.2019 09:15

Да, только что проверил, и это только в текущей папке. И вопрос говорит искать в подкаталогах.

Brother 13.06.2019 12:23

@Брат Так и есть. Обновлено.

VGR 13.06.2019 13:57

Я запускаю ваш код с моей папкой /tmp (то же самое из моего примера), и он ничего не печатает. И отсутствует { в строке попытки

Brother 13.06.2019 14:59

@Brother Добавлена ​​недостающая фигурная скобка. Код работает отлично для меня. Вы используете Paths.get("/tmp")?

VGR 13.06.2019 15:11

Другие вопросы по теме