Glob is a pattern that is used to match files to a pattern. For example, suppose we wish to match all Kotlin files on our file system, we would use the syntax “glob:*.kt”. The following demo program walks through a user-supplied start path and matches all files according to the user-supplied glob pattern.
package ch9.files import java.nio.file.FileSystems import java.nio.file.Files import java.nio.file.Path import java.nio.file.Paths import java.util.stream.Collectors.toList private fun prompt(msg : String) : String { print("$msg => ") return readLine() ?: "" } fun main(args : Array<String>){ val start = prompt("Enter a start path") val glob = prompt("Enter a glob pattern") //Object a matcher object from the supplied Glob pattern val matcher = FileSystems.getDefault().getPathMatcher(glob) val path = Paths.get(start) //Walk the file system Files.walk(path) //Filter out anything that doesn't match the glob .filter { it : Path? -> it?.let { matcher.matches(it.fileName) } ?: false } //Collect to a list .collect(toList()) //Print to the console .forEach({ it -> println("Found ${it.fileName}") }) }
Here is an example run of the program.
Enter a start path => /users/stonesoup Enter a glob pattern => glob:*.kt Found CachingTutorialApplicationTests.kt Found CachingTutorialApplication.kt Found ExposedTransactionManagerTest.kt Found SpringTransactionManager.kt Found SamplesDao.kt Found SamplesSQL.kt ...continued
Detailed Explanation
The program asks the user for a start path (line 15) and a glob syntax (line 16). The program supports the glob patterns in the table below.
Pattern | Description |
---|---|
* | Matches anything |
** | Matches anything even accross directories |
? | The ? mark matches any single character |
[xyz] | Matches any character inside of [ ]. In this example, it’s x, y, or z |
[0-5], [a-z] | Matches a range. In this case, it’s 0-5 or the letters a-z |
{xyz, abc} | Matches one of the two patterns. In this case, either xyz or abc |
Once the user has supplied a valid path and glob pattern, the program calls Files.walk to walk through the file system. Using Java 8’s Streaming API, we filter all items that do not match the pattern (line 25) using the matcher object that was returned on line 19. The results are collected into a list and printed to the console.
References
https://docs.oracle.com/javase/8/docs/api/?java/io/File.html
https://docs.oracle.com/javase/8/docs/api/?java/io/File.html