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