How to find files that match a wildcard string in Java?
Consider DirectoryScanner from Apache Ant:
DirectoryScanner scanner = new DirectoryScanner();
scanner.setIncludes(new String[]{"**/*.java"});
scanner.setBasedir("C:/Temp");
scanner.setCaseSensitive(false);
scanner.scan();
String[] files = scanner.getIncludedFiles();
You'll need to reference ant.jar (~ 1.3 MB for ant 1.7.1).
How to use a Wildcard in Java filepath
I don't think that it's possible to use wildcard in such way. I propose you to use a way like this for your task:
File orig = new File("\test\orig");
File[] directories = orig.listFiles(new FileFilter() {
public boolean accept(File pathname) {
return pathname.isDirectory();
}
});
ArrayList<File> files = new ArrayList<File>();
for (File directory : directories) {
File file = new File(directory, "test.zip");
if (file.exists())
files.add(file);
}
System.out.println(files.toString());
how to find wildcard folders search in java 1.7 or in 8
Assuming you have following directory structure
/tmp/usr/local/bar/test1/fol1
/tmp/usr/local/baz/test2/fol2
/tmp/usr/local/foo/test3/fol3
/tmp/usr/local/foobar/test/fol
/tmp/usr/local/foobar/test/dummy
/tmp/usr/local/foobar/dummy
A possible solution for Java 7+ might be
import java.io.IOException;
import java.nio.file.FileSystem;
import java.nio.file.FileSystems;
import java.nio.file.FileVisitOption;
import java.nio.file.FileVisitResult;
import static java.nio.file.FileVisitResult.CONTINUE;
import java.nio.file.FileVisitor;
import java.nio.file.Files;
import java.nio.file.Path;
import java.nio.file.PathMatcher;
import java.nio.file.Paths;
import java.nio.file.attribute.BasicFileAttributes;
import java.util.EnumSet;
public class FindWalkFileTree {
public static class Finder implements FileVisitor<Path> {
private final PathMatcher matcher;
Finder(String pattern) {
final FileSystem fs = FileSystems.getDefault();
matcher = fs.getPathMatcher("glob:" + pattern);
}
void find(Path file) {
if (matcher.matches(file)) {
System.out.format("%s%n", file);
}
}
@Override
public FileVisitResult visitFile(Path file,
BasicFileAttributes attrs) {
find(file);
return CONTINUE;
}
@Override
public FileVisitResult postVisitDirectory(Path dir,
IOException exc) {
return CONTINUE;
}
@Override
public FileVisitResult visitFileFailed(Path file, IOException exc) {
return CONTINUE;
}
@Override
public FileVisitResult preVisitDirectory(Path dir,
BasicFileAttributes attrs) throws IOException {
find(dir);
return CONTINUE;
}
}
public static void main(String[] args) throws IOException {
Path searchDir = Paths.get("/tmp/usr/local");
String pattern = "/tmp/usr/local/*/test*/fol*";
EnumSet<FileVisitOption> opts = EnumSet.of(
FileVisitOption.FOLLOW_LINKS);
Finder finder = new Finder(pattern);
Files.walkFileTree(searchDir, opts, Integer.MAX_VALUE, finder);
}
}
A possible Java 8 solution might be
import java.io.File;
import java.io.IOException;
import java.nio.file.FileSystem;
import java.nio.file.FileSystems;
import java.nio.file.FileVisitOption;
import java.nio.file.Files;
import java.nio.file.Path;
import java.nio.file.PathMatcher;
import java.util.stream.Stream;
public class FindWalk {
public static void main(String[] args) throws IOException {
File dataDir = new File("/tmp/usr/local");
FileSystem fs = FileSystems.getDefault();
String pattern = "/tmp/usr/local/*/test*/fol*";
PathMatcher pathMatcher = fs.getPathMatcher("glob:" + pattern);
FileVisitOption opts = FileVisitOption.FOLLOW_LINKS;
try (Stream<Path> stream = Files.walk(dataDir.toPath(), opts)) {
stream.filter(pathMatcher::matches)
.forEach(System.out::println);
}
}
}
output for both solutions
/tmp/usr/local/bar/test1/fol1
/tmp/usr/local/baz/test2/fol2
/tmp/usr/local/foo/test3/fol3
/tmp/usr/local/foobar/test/fol
The processing always starts from directory /tmp/usr/local/
.
How to use wildcards in filenames when reading in files
Try FileUtils from Apache commons-io (listFiles and iterateFiles methods):
The code you need is
File dir = new File(".");
FileFilter fileFilter = new WildcardFileFilter("*.Log");
File[] files = dir.listFiles(fileFilter);
for (int i = 0; i < files.length; i++) {
System.out.println(files[i]);
}
How to check a file if exists with wildcard in Java?
Pass a FileFilter
(coded here anonymously) into the listFiles()
method of the dir File
, like this:
File dir = new File("some/path/to/dir");
final String id = "XXX"; // needs to be final so the anonymous class can use it
File[] matchingFiles = dir.listFiles(new FileFilter() {
public boolean accept(File pathname) {
return pathname.getName().equals("a_id_" + id + ".zip");
}
});
Bundled as a method, it would look like:
public static File[] findFilesForId(File dir, final String id) {
return dir.listFiles(new FileFilter() {
public boolean accept(File pathname) {
return pathname.getName().equals("a_id_" + id + ".zip");
}
});
}
and which you could call like:
File[] matchingFiles = findFilesForId(new File("some/path/to/dir"), "XXX");
or to simply check for existence,
boolean exists = findFilesForId(new File("some/path/to/dir"), "XXX").length > 0
Listing files in a directory matching a pattern in Java
See File#listFiles(FilenameFilter).
File dir = new File(".");
File [] files = dir.listFiles(new FilenameFilter() {
@Override
public boolean accept(File dir, String name) {
return name.endsWith(".xml");
}
});
for (File xmlfile : files) {
System.out.println(xmlfile);
}
In Scala find files that match a wildcard String
scala> import reflect.io._, Path._
import reflect.io._
import Path._
scala> val r = """.*\.scala""".r
r: scala.util.matching.Regex = .*\.scala
scala> "/home/amarki/tmp".toDirectory.files map (_.name) flatMap { case n @ r() => Some(n) case _ => None }
res0: Iterator[String] = non-empty iterator
scala> .toList
res1: List[String] = List(bobsrandom.scala, ...)
or recursing
scala> import PartialFunction.{ cond => when }
import PartialFunction.{cond=>when}
scala> "/home/amarki/tmp" walkFilter (p => p.isDirectory || when(p.name) {
| case r() => true })
res3: Iterator[scala.reflect.io.Path] = non-empty iterator
List all Files from a Directory that match a File Mask (a.k.a Pattern or Glob)
I think I might have solved my own question with the insight received here and other questions mentioning the PathMatcher
object
final PathMatcher maskMatcher = FileSystems.getDefault()
.getPathMatcher("glob:" + mask);
final List<Path> matchedFiles = Files.walk(path)
.collect(Collectors.toList());
final List<Path> filesToRemove = new ArrayList<>(matchedFiles.size());
matchedFiles.forEach(foundPath -> {
if (!maskMatcher.matches(foundPath.getFileName()) || Files.isDirectory(foundPath)) {
filesToRemove.add(foundPath);
}
});
matchedFiles.removeAll(filesToRemove);
So basically .getPathMatcher("glob:" + mask);
is the same thing that the DirectoryStream was doing to filter the files
All I have to do now after that is filtering the list of paths that I get with Files.walk by removing the elements that do not match my PathMatcher and are not of type File
Related Topics
Simple Http Server in Java Using Only Java Se API
How to Use Java Property Files
Remove Diacritical Marks (Ń Ǹ Ň ñ Ṅ Ņ Ṇ Ṋ Ṉ ̈ Ɲ Ƞ ᶇ ɳ ȵ) from Unicode Chars
How to Create a Jar with External Libraries Included in Eclipse
Using Regex to Generate Strings Rather Than Match Them
Why Does Java Prohibit Static Fields in Inner Classes
How to Fix Org.Hibernate.Lazyinitializationexception - Could Not Initialize Proxy - No Session
Ignoring New Fields on JSON Objects Using Jackson
Java.Lang.Runtimeexception: Uncompilable Source Code - What Can Cause This
Why Should Java 8's Optional Not Be Used in Arguments
Which Is the Best Library for Xml Parsing in Java
Java, Classpath, Classloading => Multiple Versions of the Same Jar/Project
Illegalmonitorstateexception on Wait() Call
Static Method in a Generic Class
Do I Need <Class> Elements in Persistence.Xml