As @Clarke said, you can use java.io.FilenameFilter
to filter the file by specific condition.
As a complementary, I’d like to show how to use java.io.FilenameFilter
to search file in current directory and its subdirectory.
The common methods getTargetFiles and printFiles are used to search files and print them.
public class SearchFiles {
//It's used in dfs
private Map<String, Boolean> map = new HashMap<String, Boolean>();
private File root;
public SearchFiles(File root){
this.root = root;
}
/**
* List eligible files on current path
* @param directory
* The directory to be searched
* @return
* Eligible files
*/
private String[] getTargetFiles(File directory){
if(directory == null){
return null;
}
String[] files = directory.list(new FilenameFilter(){
@Override
public boolean accept(File dir, String name) {
// TODO Auto-generated method stub
return name.startsWith("Temp") && name.endsWith(".txt");
}
});
return files;
}
/**
* Print all eligible files
*/
private void printFiles(String[] targets){
for(String target: targets){
System.out.println(target);
}
}
}
I will demo how to use recursive, bfs and dfs to get the job done.
Recursive:
/**
* How many files in the parent directory and its subdirectory <br>
* depends on how many files in each subdirectory and their subdirectory
*/
private void recursive(File path){
printFiles(getTargetFiles(path));
for(File file: path.listFiles()){
if(file.isDirectory()){
recursive(file);
}
}
if(path.isDirectory()){
printFiles(getTargetFiles(path));
}
}
public static void main(String args[]){
SearchFiles searcher = new SearchFiles(new File("C:\example"));
searcher.recursive(searcher.root);
}
Breadth First Search:
/**
* Search the node's neighbors firstly before moving to the next level neighbors
*/
private void bfs(){
if(root == null){
return;
}
Queue<File> queue = new LinkedList<File>();
queue.add(root);
while(!queue.isEmpty()){
File node = queue.remove();
printFiles(getTargetFiles(node));
File[] childs = node.listFiles(new FileFilter(){
@Override
public boolean accept(File pathname) {
// TODO Auto-generated method stub
if(pathname.isDirectory())
return true;
return false;
}
});
if(childs != null){
for(File child: childs){
queue.add(child);
}
}
}
}
public static void main(String args[]){
SearchFiles searcher = new SearchFiles(new File("C:\example"));
searcher.bfs();
}
Depth First Search:
/**
* Search as far as possible along each branch before backtracking
*/
private void dfs(){
if(root == null){
return;
}
Stack<File> stack = new Stack<File>();
stack.push(root);
map.put(root.getAbsolutePath(), true);
while(!stack.isEmpty()){
File node = stack.peek();
File child = getUnvisitedChild(node);
if(child != null){
stack.push(child);
printFiles(getTargetFiles(child));
map.put(child.getAbsolutePath(), true);
}else{
stack.pop();
}
}
}
/**
* Get unvisited node of the node
*
*/
private File getUnvisitedChild(File node){
File[] childs = node.listFiles(new FileFilter(){
@Override
public boolean accept(File pathname) {
// TODO Auto-generated method stub
if(pathname.isDirectory())
return true;
return false;
}
});
if(childs == null){
return null;
}
for(File child: childs){
if(map.containsKey(child.getAbsolutePath()) == false){
map.put(child.getAbsolutePath(), false);
}
if(map.get(child.getAbsolutePath()) == false){
return child;
}
}
return null;
}
public static void main(String args[]){
SearchFiles searcher = new SearchFiles(new File("C:\example"));
searcher.dfs();
}
I need a to find file according to its name in directory tree. And then show a path to this file. I found something like this, but it search according extension. Could anybody help me how can I rework this code to my needs…thanks
public class filesFinder {
public static void main(String[] args) {
File root = new File("c:\test");
try {
String[] extensions = {"txt"};
boolean recursive = true;
Collection files = FileUtils.listFiles(root, extensions, recursive);
for (Iterator iterator = files.iterator(); iterator.hasNext();) {
File file = (File) iterator.next();
System.out.println(file.getAbsolutePath());
}
} catch (Exception e) {
e.printStackTrace();
}
}
}
asked Jun 6, 2011 at 12:07
1
public class Test {
public static void main(String[] args) {
File root = new File("c:\test");
String fileName = "a.txt";
try {
boolean recursive = true;
Collection files = FileUtils.listFiles(root, null, recursive);
for (Iterator iterator = files.iterator(); iterator.hasNext();) {
File file = (File) iterator.next();
if (file.getName().equals(fileName))
System.out.println(file.getAbsolutePath());
}
} catch (Exception e) {
e.printStackTrace();
}
}
}
answered Jun 6, 2011 at 12:20
UdiUdi
1,0501 gold badge12 silver badges25 bronze badges
4
Recursive directory search in Java is pretty darn easy. The java.io.File
class has a listFiles()
method that gives all the File
children of a directory; there’s also an isDirectory()
method you call on a File
to determine whether you should recursively search through a particular child.
answered Jun 6, 2011 at 12:11
1
You can use FileFilter Like this.
public class MyFileNameFilter implements FilenameFilter {
@Override
public boolean accept(File arg0, String arg1) {
// TODO Auto-generated method stub
boolean result =false;
if(arg1.startsWith("KB24"))
result = true;
return result;
}
}
And call it like this
File f = new File("C:\WINDOWS");
String [] files = null;
if(f.isDirectory()) {
files = f.list(new MyFileNameFilter());
}
for(String s: files) {
System.out.print(s);
System.out.print("t");
}
Java 8 Lamda make this easier instead of using FileNameFilter, pass lambda expression
File[] filteredFiles = f.listFiles((file, name) ->name.endsWith(extn));
answered Jun 6, 2011 at 12:21
sudmongsudmong
2,02613 silver badges12 bronze badges
4
I don’t really know what FileUtils does, but how about changing “txt” in extenstions to “yourfile.whatever”?
answered Jun 6, 2011 at 12:14
UdiUdi
1,0501 gold badge12 silver badges25 bronze badges
1
public static File find(String path, String fName) {
File f = new File(path);
if (fName.equalsIgnoreCase(f.getName())) return f;
if (f.isDirectory()) {
for (String aChild : f.list()) {
File ff = find(path + File.separator + aChild, fName);
if (ff != null) return ff;
}
}
return null;
}
answered May 13, 2015 at 8:34
MarMar
3911 gold badge3 silver badges3 bronze badges
Improve Article
Save Article
Like Article
Improve Article
Save Article
Like Article
Searching files in Java can be performed using the File class and FilenameFilter interface. The FilenameFilter interface is used to filter files from the list of files. This interface has a method boolean accept(File dir, String name) that is implemented to find the desired files from the list returned by the java.io.File.list() method. This method is very useful when we want to find files with a specific extension within a folder.
First Approach
- Create a class MyFilenameFilter which implements the FilenameFilter interface and overrides the accept() method of FilenameFilter interface.
- The accept() method takes two arguments of which the first one is the directory name and the second one is the filename.
- The accept() method returns true if the filename starts with the specified initials else returns false.
- The class FindFile contains the main method which accepts the user input like the desired directory to search and the initials of the file to search.
- The directory object of File class is initiated with the director name and the filter object of MyFilenameFilter class is initiated with the initials provided by the user.
- The list() method is invoked on the dir object which returns an array of files that satisfy the condition.
- The array is iterated over and the name of the required files are printed to the output screen.
Code Implementation
Java
import
java.io.*;
class
MyFilenameFilter
implements
FilenameFilter {
String initials;
public
MyFilenameFilter(String initials)
{
this
.initials = initials;
}
public
boolean
accept(File dir, String name)
{
return
name.startsWith(initials);
}
}
public
class
Main {
public
static
void
main(String[] args)
{
File directory =
new
File(
"/home/user/"
);
MyFilenameFilter filter
=
new
MyFilenameFilter(
"file.cpp"
);
String[] flist = directory.list(filter);
if
(flist ==
null
) {
System.out.println(
"Empty directory or directory does not exists."
);
}
else
{
for
(
int
i =
0
; i < flist.length; i++) {
System.out.println(flist[i]+
" found"
);
}
}
}
}
Output
file.cpp found
Second Approach
- The list() method is called on the dir object of the File class and the list of files in the ‘flist’ array.
- Each file in the ‘flist’ array is checked against the required filename.
- If a match is found it is printed on the screen.
This method is a bit different from the previous one as the user needs to specify the exact name of the file in this case.
Code Implementation
Java
import
java.io.File;
public
class
Main {
public
static
void
main(String[] argv)
throws
Exception
{
File directory =
new
File(
"/home/user/"
);
String[] flist = directory.list();
int
flag =
0
;
if
(flist ==
null
) {
System.out.println(
"Empty directory."
);
}
else
{
for
(
int
i =
0
; i < flist.length; i++) {
String filename = flist[i];
if
(filename.equalsIgnoreCase(
"file.cpp"
)) {
System.out.println(filename +
" found"
);
flag =
1
;
}
}
}
if
(flag ==
0
) {
System.out.println(
"File Not Found"
);
}
}
}
Output
file.cpp found
Last Updated :
21 Oct, 2020
Like Article
Save Article
job4j_finder
- Об утилите
- Сборка и запуск
- Использование
- Контакты
Об утилите
Данная утилита умеет искать файлы в заданном каталоге и подкаталогах.
Сборка и запуск
Запуск через терминал
1.Собрать jar через Maven
mvn install
2.Запустить jar файл
java -jar target/finer.jar
Запуск через IDE
Перейти к папке src/main/java
и файлу ru.job4j.finder.CriterionFinder
Использование
Программа ищет данные в заданном каталоге и подкаталогах. Имя файла может задаваться целиком, по маске, по регулярному
выражению (необязательно).
Ключи:
- -d – директория, в которой начинать поиск.
- -n – имя файла, маска, либо регулярное выражение.
- -t – тип поиска: mask искать по маске, name по полному совпадению имени, regex по регулярному выражению.
- -o – результат записать в файл.
Контакты
Становов Семён Сергеевич
Email: sestanovov@gmail.com
Telegram: @stanovovss
Мне нужно найти файл в соответствии с его именем в дереве каталогов. Затем укажите путь к этому файлу. Я нашел что-то вроде этого, но это поиск по расширению. Может ли кто-нибудь помочь мне, как я могу доработать этот код для моих нужд… спасибо
public class filesFinder {
public static void main(String[] args) {
File root = new File("c:\test");
try {
String[] extensions = {"txt"};
boolean recursive = true;
Collection files = FileUtils.listFiles(root, extensions, recursive);
for (Iterator iterator = files.iterator(); iterator.hasNext();) {
File file = (File) iterator.next();
System.out.println(file.getAbsolutePath());
}
} catch (Exception e) {
e.printStackTrace();
}
}
}
06 июнь 2011, в 14:20
Поделиться
Источник
5 ответов
public class Test {
public static void main(String[] args) {
File root = new File("c:\test");
String fileName = "a.txt";
try {
boolean recursive = true;
Collection files = FileUtils.listFiles(root, null, recursive);
for (Iterator iterator = files.iterator(); iterator.hasNext();) {
File file = (File) iterator.next();
if (file.getName().equals(fileName))
System.out.println(file.getAbsolutePath());
}
} catch (Exception e) {
e.printStackTrace();
}
}
}
Udi
06 июнь 2011, в 12:57
Поделиться
Рекурсивный поиск в каталоге на Java довольно прост. Класс java.io.File
имеет метод listFiles()
, который дает все дочерние элементы File
каталога; существует также метод isDirectory()
, который вы вызываете File
, чтобы определить, следует ли вам рекурсивно искать конкретный дочерний элемент.
Ernest Friedman-Hill
06 июнь 2011, в 14:00
Поделиться
Вы можете использовать FileFilter Как это сделать.
public class MyFileNameFilter implements FilenameFilter {
@Override
public boolean accept(File arg0, String arg1) {
// TODO Auto-generated method stub
boolean result =false;
if(arg1.startsWith("KB24"))
result = true;
return result;
}
}
И назовите это так
File f = new File("C:\WINDOWS");
String [] files = null;
if(f.isDirectory()) {
files = f.list(new MyFileNameFilter());
}
for(String s: files) {
System.out.print(s);
System.out.print("t");
}
sudmong
06 июнь 2011, в 13:22
Поделиться
public static File find(String path, String fName) {
File f = new File(path);
if (fName.equalsIgnoreCase(f.getName())) return f;
if (f.isDirectory()) {
for (String aChild : f.list()) {
File ff = find(path + File.separator + aChild, fName);
if (ff != null) return ff;
}
}
return null;
}
Mar
13 май 2015, в 09:11
Поделиться
Я действительно не знаю, что делает FileUtils, но как насчет изменения “txt” в extenstions на “yourfile.whatever”?
Udi
06 июнь 2011, в 12:23
Поделиться
Ещё вопросы
- 1Java: заполнение Scanner значением по умолчанию для Scanner.nextLine ();
- 0Почему значение файла cookie, который я устанавливаю (строка), увеличивается на единицу при установке из $ _GET?
- 1C3P0 тупик после того, как сервер простаивает в течение ночи
- 0boost :: mutex поддерживает try_lock_for в Visual Studio, но не в Xcode
- 0Передача переменной из .htaccess на страницу PHP
- 1Как поделиться кодом котлина в IntelliJ IDEA между рабочим столом, android и сервером?
- 1Подпись по java и openssl не совпадает
- 0Как я могу удалить выбранную строку в таблице HTML, а также в MySQL, используя CodeIgniter?
- 0ложный HTTP-ответ с обещаниями и возвращением фиктивных данных
- 0я могу создать общую память (используя CreateFileMapping) в локальном пространстве имен с тем же именем?
- 0Тестирование углового модала открытое обещание
- 1Композитные ключи на столе с другими свойствами
- 0Запутанная таблица CSS
- 1Как хранить коллекцию массивов в asp.net viewstate
- 0стиль не меняется (нужна помощь в медиа-запросе!)
- 0Удаление определенной части массива PHP
- 0ограничивающие элементы, когда я нажимаю больше, чтобы загрузить другие элементы
- 0Неверно сформированный URL передан фабрике angularjs
- 0Mysqli выбрать и считать
- 1Как сделать номера телефонов кликабельными в текстовом представлении в Android
- 1Сравните два списка, пункт за пунктом, используя linq
- 1обновить фрейм данных по индексам, возвращаемым запросом
- 0переопределение метода базового класса с использованием виртуального не работает
- 0Индикатор выполнения во время работы в консольном приложении
- 0Как добавить текст с пробелами для метки с помощью jquery?
- 1Как получить значение столбца DataTable с массивом?
- 1Почему Java Thread искажает печать на консоль [дубликаты]
- 1Блок перемещается только один раз на KEYDOWN (Python3.6 – Pygame)
- 0CB_SELECTSTRING игнорируется на некоторых машинах
- 1System.Collections.IEnumerator не содержит общедоступного определения для GetEnumerator.
- 0Href vs select box
- 1Android-просмотр списка XML с фильтром
- 0Qt Сбой при двойном нажатии на элемент listWidget
- 1как сохранить, а затем извлечь некоторую информацию из имен файлов в dataframe
- 0У меня есть ошибка с использованием этого-> в C ++
- 1Как сохранить клавиатуру InputField открытой при потере фокуса?
- 0Расширяемое меню HTML
- 1Информация о подписчике класса «SynchronousHelper» не совпадает с информацией о подписчике других классов в том же пакете
- 1Как поделиться чем-то, используя приложение Twitter на Windows Phone 8?
- 1Загрузка PDF с Dropbox на телефон с заданного URI в Base64 дает сломанный нечитаемый PDF
- 1изменить размер изображения по площади
- 0Любой другой способ объединить PayPal с IPN?
- 0Использование углового сервиса внутри друг друга
- 0проверка, сколько у div определенного класса
- 0MySQL: как выбрать min (), используя подзапрос и объединения
- 0Подождите, пока загрузится следующая страница, затем нажмите
- 1Получить мобильный оператор в приложении Windows Phone XAML
- 0Подсказка Highcharts показывает дополнительные данные
- 0Загрузка изображений напрямую с сервера
- 0Создание пула объектов