diff --git a/libraries-6/README.md b/libraries-6/README.md
index 4236a65d95..5f8a608010 100644
--- a/libraries-6/README.md
+++ b/libraries-6/README.md
@@ -17,4 +17,4 @@ Remember, for advanced libraries like [Jackson](/jackson) and [JUnit](/testing-m
- [Using libphonenumber to Validate Phone Numbers](https://www.baeldung.com/java-libphonenumber)
- [Apache Commons Collections vs Google Guava](https://www.baeldung.com/apache-commons-collections-vs-guava)
- [Guide to Using ModelMapper](https://www.baeldung.com/java-modelmapper)
-- More articles [[<-- prev]](/libraries-5)
+- More articles [[<-- prev]](/libraries-5) [[next -->]](/libraries-7)
diff --git a/libraries-7/README.md b/libraries-7/README.md
new file mode 100644
index 0000000000..105a2ef16d
--- /dev/null
+++ b/libraries-7/README.md
@@ -0,0 +1,11 @@
+## Libraries-7
+
+This module contains articles about various Java libraries.
+These are small libraries that are relatively easy to use and do not require any separate module of their own.
+
+The code examples related to different libraries are each in their own module.
+
+Remember, for advanced libraries like [Jackson](/jackson) and [JUnit](/testing-modules) we already have separate modules. Please make sure to have a look at the existing modules in such cases.
+
+### Relevant articles
+- More articles [[<-- prev]](/libraries-6)
diff --git a/libraries-7/pom.xml b/libraries-7/pom.xml
new file mode 100644
index 0000000000..40c4785d40
--- /dev/null
+++ b/libraries-7/pom.xml
@@ -0,0 +1,22 @@
+
+
+ 4.0.0
+ libraries-7
+
+
+ parent-modules
+ com.baeldung
+ 1.0.0-SNAPSHOT
+
+
+
+
+ commons-io
+ commons-io
+ ${commons-io.version}
+
+
+
+
\ No newline at end of file
diff --git a/libraries-7/src/main/java/com/baeldung/findfiles/FindFileApacheUtils.java b/libraries-7/src/main/java/com/baeldung/findfiles/FindFileApacheUtils.java
new file mode 100644
index 0000000000..408d2dcf36
--- /dev/null
+++ b/libraries-7/src/main/java/com/baeldung/findfiles/FindFileApacheUtils.java
@@ -0,0 +1,29 @@
+package com.baeldung.findfiles;
+
+import java.io.File;
+import java.nio.file.Files;
+import java.nio.file.Path;
+import java.util.Iterator;
+
+import org.apache.commons.io.FileUtils;
+import org.apache.commons.io.filefilter.TrueFileFilter;
+import org.apache.commons.io.filefilter.WildcardFileFilter;
+
+public class FindFileApacheUtils {
+
+ private FindFileApacheUtils() {
+ }
+
+ public static Iterator find(Path startPath, String extension) {
+ if (!Files.isDirectory(startPath)) {
+ throw new IllegalArgumentException("Provided path is not a directory: " + startPath);
+ }
+
+ if (!extension.startsWith("."))
+ extension = "." + extension;
+
+ return FileUtils.iterateFiles(startPath.toFile(), WildcardFileFilter.builder()
+ .setWildcards("*" + extension)
+ .get(), TrueFileFilter.INSTANCE);
+ }
+}
diff --git a/libraries-7/src/main/java/com/baeldung/findfiles/FindFileJava2Utils.java b/libraries-7/src/main/java/com/baeldung/findfiles/FindFileJava2Utils.java
new file mode 100644
index 0000000000..8982f918f5
--- /dev/null
+++ b/libraries-7/src/main/java/com/baeldung/findfiles/FindFileJava2Utils.java
@@ -0,0 +1,34 @@
+package com.baeldung.findfiles;
+
+import java.io.File;
+import java.util.ArrayList;
+import java.util.List;
+
+public class FindFileJava2Utils {
+
+ private FindFileJava2Utils() {
+ }
+
+ public static List find(File startPath, String extension) {
+ if (!startPath.isDirectory()) {
+ throw new IllegalArgumentException("Provided path is not a directory: " + startPath);
+ }
+
+ List matches = new ArrayList<>();
+
+ File[] files = startPath.listFiles();
+ if (files == null)
+ return matches;
+
+ MatchExtensionPredicate filter = new MatchExtensionPredicate(extension);
+ for (File file : files) {
+ if (file.isDirectory()) {
+ matches.addAll(find(file, extension));
+ } else if (filter.test(file.toPath())) {
+ matches.add(file);
+ }
+ }
+
+ return matches;
+ }
+}
diff --git a/libraries-7/src/main/java/com/baeldung/findfiles/FindFileJava7Utils.java b/libraries-7/src/main/java/com/baeldung/findfiles/FindFileJava7Utils.java
new file mode 100644
index 0000000000..6d2cc4f946
--- /dev/null
+++ b/libraries-7/src/main/java/com/baeldung/findfiles/FindFileJava7Utils.java
@@ -0,0 +1,44 @@
+package com.baeldung.findfiles;
+
+import java.io.IOException;
+import java.nio.file.FileVisitResult;
+import java.nio.file.Files;
+import java.nio.file.Path;
+import java.nio.file.SimpleFileVisitor;
+import java.nio.file.attribute.BasicFileAttributes;
+import java.util.ArrayList;
+import java.util.List;
+
+public class FindFileJava7Utils {
+
+ private FindFileJava7Utils() {
+ }
+
+ public static List find(Path startPath, String extension) throws IOException {
+ if (!Files.isDirectory(startPath)) {
+ throw new IllegalArgumentException("Provided path is not a directory: " + startPath);
+ }
+
+ final List matches = new ArrayList<>();
+ MatchExtensionPredicate filter = new MatchExtensionPredicate(extension);
+
+ Files.walkFileTree(startPath, new SimpleFileVisitor() {
+
+ @Override
+ public FileVisitResult visitFile(Path file, BasicFileAttributes attributes) {
+ if (filter.test(file)) {
+ matches.add(file);
+ }
+
+ return FileVisitResult.CONTINUE;
+ }
+
+ @Override
+ public FileVisitResult visitFileFailed(Path file, IOException exc) {
+ return FileVisitResult.CONTINUE;
+ }
+ });
+
+ return matches;
+ }
+}
diff --git a/libraries-7/src/main/java/com/baeldung/findfiles/FindFileJava8Utils.java b/libraries-7/src/main/java/com/baeldung/findfiles/FindFileJava8Utils.java
new file mode 100644
index 0000000000..b265bebe7d
--- /dev/null
+++ b/libraries-7/src/main/java/com/baeldung/findfiles/FindFileJava8Utils.java
@@ -0,0 +1,21 @@
+package com.baeldung.findfiles;
+
+import java.io.IOException;
+import java.nio.file.Files;
+import java.nio.file.Path;
+import java.util.function.Consumer;
+
+public class FindFileJava8Utils {
+
+ private FindFileJava8Utils() {
+ }
+
+ public static void find(Path startPath, String extension, Consumer consumer) throws IOException {
+ if (!Files.isDirectory(startPath)) {
+ throw new IllegalArgumentException("Provided path is not a directory: " + startPath);
+ }
+
+ MatchExtensionPredicate filter = new MatchExtensionPredicate(extension);
+ Files.walkFileTree(startPath, new SimpleFileConsumerVisitor(filter, consumer));
+ }
+}
diff --git a/libraries-7/src/main/java/com/baeldung/findfiles/MatchExtensionPredicate.java b/libraries-7/src/main/java/com/baeldung/findfiles/MatchExtensionPredicate.java
new file mode 100644
index 0000000000..351cdd0590
--- /dev/null
+++ b/libraries-7/src/main/java/com/baeldung/findfiles/MatchExtensionPredicate.java
@@ -0,0 +1,26 @@
+package com.baeldung.findfiles;
+
+import java.nio.file.Path;
+import java.util.function.Predicate;
+
+public class MatchExtensionPredicate implements Predicate {
+
+ private final String extension;
+
+ public MatchExtensionPredicate(String extension) {
+ if (!extension.startsWith("."))
+ extension = "." + extension;
+ this.extension = extension.toLowerCase();
+ }
+
+ @Override
+ public boolean test(Path path) {
+ if (path == null)
+ return false;
+
+ return path.getFileName()
+ .toString()
+ .toLowerCase()
+ .endsWith(extension);
+ }
+}
diff --git a/libraries-7/src/main/java/com/baeldung/findfiles/SimpleFileConsumerVisitor.java b/libraries-7/src/main/java/com/baeldung/findfiles/SimpleFileConsumerVisitor.java
new file mode 100644
index 0000000000..632499d279
--- /dev/null
+++ b/libraries-7/src/main/java/com/baeldung/findfiles/SimpleFileConsumerVisitor.java
@@ -0,0 +1,33 @@
+package com.baeldung.findfiles;
+
+import java.io.IOException;
+import java.nio.file.FileVisitResult;
+import java.nio.file.Path;
+import java.nio.file.SimpleFileVisitor;
+import java.nio.file.attribute.BasicFileAttributes;
+import java.util.function.Consumer;
+import java.util.function.Predicate;
+
+public class SimpleFileConsumerVisitor extends SimpleFileVisitor {
+
+ private final Predicate filter;
+ private final Consumer consumer;
+
+ public SimpleFileConsumerVisitor(MatchExtensionPredicate filter, Consumer consumer) {
+ this.filter = filter;
+ this.consumer = consumer;
+ }
+
+ @Override
+ public FileVisitResult visitFile(Path file, BasicFileAttributes attributes) {
+ if (filter.test(file))
+ consumer.accept(file);
+
+ return FileVisitResult.CONTINUE;
+ }
+
+ @Override
+ public FileVisitResult visitFileFailed(Path file, IOException exc) throws IOException {
+ return FileVisitResult.CONTINUE;
+ }
+}
diff --git a/libraries-7/src/test/java/com/baeldung/findfiles/FindFileUtilsIntegrationTest.java b/libraries-7/src/test/java/com/baeldung/findfiles/FindFileUtilsIntegrationTest.java
new file mode 100644
index 0000000000..ddd7b7e155
--- /dev/null
+++ b/libraries-7/src/test/java/com/baeldung/findfiles/FindFileUtilsIntegrationTest.java
@@ -0,0 +1,79 @@
+package com.baeldung.findfiles;
+
+import static org.junit.jupiter.api.Assertions.assertEquals;
+
+import java.io.File;
+import java.io.IOException;
+import java.nio.file.Files;
+import java.nio.file.Path;
+import java.util.ArrayList;
+import java.util.Iterator;
+import java.util.List;
+import java.util.concurrent.atomic.AtomicInteger;
+
+import org.apache.commons.io.FileUtils;
+import org.junit.jupiter.api.AfterAll;
+import org.junit.jupiter.api.BeforeAll;
+import org.junit.jupiter.api.Test;
+
+public class FindFileUtilsIntegrationTest {
+
+ private static final String TEST_EXTENSION = ".test";
+ private static final String OTHER_EXTENSION = ".other";
+
+ private static final List TEST_FILES = new ArrayList<>();
+ private static final List OTHER_FILES = new ArrayList<>();
+
+ private static Path TEST_DIR;
+
+ @BeforeAll
+ static void setup() throws IOException {
+ TEST_DIR = Files.createTempDirectory(null);
+
+ final Path nestedDir = TEST_DIR.resolve("sub-dir");
+ Files.createDirectories(nestedDir);
+
+ TEST_FILES.add(Files.createFile(TEST_DIR.resolve("a" + TEST_EXTENSION)));
+ OTHER_FILES.add(Files.createFile(TEST_DIR.resolve("a" + OTHER_EXTENSION)));
+
+ TEST_FILES.add(Files.createFile(nestedDir.resolve("b" + TEST_EXTENSION)));
+ OTHER_FILES.add(Files.createFile(nestedDir.resolve("b" + OTHER_EXTENSION)));
+ }
+
+ @AfterAll
+ static void cleanUp() {
+ FileUtils.deleteQuietly(TEST_DIR.toFile());
+ }
+
+ @Test
+ void whenFindFilesWithJava2_thenOnlyMatchingFilesFound() {
+ List matches = FindFileJava2Utils.find(TEST_DIR.toFile(), TEST_EXTENSION);
+
+ assertEquals(TEST_FILES.size(), matches.size());
+ }
+
+ @Test
+ void whenFindFilesWithJava7_thenOnlyMatchingFilesFound() throws IOException {
+ List matches = FindFileJava7Utils.find(TEST_DIR, TEST_EXTENSION);
+
+ assertEquals(TEST_FILES.size(), matches.size());
+ }
+
+ @Test
+ void whenFindFilesWithJava8_thenOnlyMatchingFilesFound() throws IOException {
+ final AtomicInteger matches = new AtomicInteger(0);
+ FindFileJava8Utils.find(TEST_DIR, TEST_EXTENSION, path -> matches.incrementAndGet());
+
+ assertEquals(TEST_FILES.size(), matches.get());
+ }
+
+ @Test
+ void whenFindFilesWithApache_thenOnlyMatchingFilesFound() {
+ final AtomicInteger matches = new AtomicInteger(0);
+ Iterator iterator = FindFileApacheUtils.find(TEST_DIR, TEST_EXTENSION);
+
+ iterator.forEachRemaining(file -> matches.incrementAndGet());
+
+ assertEquals(TEST_FILES.size(), matches.get());
+ }
+}
diff --git a/pom.xml b/pom.xml
index 48da93fea4..39bf6453ac 100644
--- a/pom.xml
+++ b/pom.xml
@@ -771,6 +771,7 @@
libraries-4
libraries-5
libraries-6
+ libraries-7
libraries-ai
libraries-apache-commons-2
libraries-apache-commons-collections
@@ -1021,6 +1022,7 @@
libraries-4
libraries-5
libraries-6
+ libraries-7
libraries-ai
libraries-apache-commons-2
libraries-apache-commons-collections