У меня проблема, у меня есть этот каталог с файлами 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()
что вы подразумеваете под "тот, что в netbeans"?
Добро пожаловать в Stack Overflow! Пожалуйста, прочтите "Как создать минимальный воспроизводимый пример". Затем используйте ссылку редактировать, чтобы улучшить свой вопрос (не добавляйте дополнительную информацию через комментарии). В противном случае мы не сможем ответить на ваш вопрос и помочь вам.
Не используйте File h = new File(filename);
, потому что это создаст ссылку на файл в текущем каталоге. Вместо этого либо используйте File h = new File(dir, filename);
, либо dir.listFiles(filter)
, чтобы получить массив File[]
, а не просто массив имен файлов.
Добро пожаловать @Shiro, я только что опубликовал ответ о том, как этого добиться с помощью библиотеки commons-io.
@Shiro, обновил ответ с помощью простой Java и проверки подкаталогов.
[ОБНОВЛЕНО] Вот как вы можете использовать простую Java и фильтровать текст из переменной, передаваемой в качестве параметра:
Вот мой каталог: /tmp
И вот работает код:
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 — это файл (а не каталог), просто он не имеет расширения.
Я пробую ваш код, но я не знаю, как импортировать библиотеку в netbeans
Привет @ShiroBestLoli, твой проект - maven или gradle? Или это обычная джава?
это простая Java, начал программировать 4 месяца назад, так что я все еще на уровне "новичок"
Привет @ShiroBestLoli. Я обновил ответ примером Plain Java.
Это также относится к подкаталогам для извлечения файлов.
Есть ли способ установить «bcm» с помощью переменной из другого класса?
Вы хотите Файлы.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));
}
Пробовал использовать это, но он просматривает только файлы в каталоге, а не каждый файл (подкаталоги).
Да, только что проверил, и это только в текущей папке. И вопрос говорит искать в подкаталогах.
@Брат Так и есть. Обновлено.
Я запускаю ваш код с моей папкой /tmp (то же самое из моего примера), и он ничего не печатает. И отсутствует { в строке попытки
@Brother Добавлена недостающая фигурная скобка. Код работает отлично для меня. Вы используете Paths.get("/tmp")
?
Эти файлы находятся в самом каталоге или в подкаталогах? Если они находятся в подкаталогах, вам нужно будет использовать FileFilter, чтобы принять любой каталог или файл, который начинается с BCM. Если они находятся в самом каталоге, тогда FilenameFilter в порядке.