Get a list of resources from classpath directory
Custom Scanner
Implement your own scanner. For example:
(limitations of this solution are mentioned in the comments)
private List<String> getResourceFiles(String path) throws IOException { List<String> filenames = new ArrayList<>(); try ( InputStream in = getResourceAsStream(path); BufferedReader br = new BufferedReader(new InputStreamReader(in))) { String resource; while ((resource = br.readLine()) != null) { filenames.add(resource); } } return filenames;}private InputStream getResourceAsStream(String resource) { final InputStream in = getContextClassLoader().getResourceAsStream(resource); return in == null ? getClass().getResourceAsStream(resource) : in;}private ClassLoader getContextClassLoader() { return Thread.currentThread().getContextClassLoader();}
Spring Framework
Use PathMatchingResourcePatternResolver
from Spring Framework.
Ronmamo Reflections
The other techniques might be slow at runtime for huge CLASSPATH values. A faster solution is to use ronmamo's Reflections API, which precompiles the search at compile time.
Here is the code
Source: forums.devx.com/showthread.php?t=153784
import java.io.File;import java.io.IOException;import java.util.ArrayList;import java.util.Collection;import java.util.Enumeration;import java.util.regex.Pattern;import java.util.zip.ZipEntry;import java.util.zip.ZipException;import java.util.zip.ZipFile;/** * list resources available from the classpath @ * */public class ResourceList{ /** * for all elements of java.class.path get a Collection of resources Pattern * pattern = Pattern.compile(".*"); gets all resources * * @param pattern * the pattern to match * @return the resources in the order they are found */ public static Collection<String> getResources( final Pattern pattern){ final ArrayList<String> retval = new ArrayList<String>(); final String classPath = System.getProperty("java.class.path", "."); final String[] classPathElements = classPath.split(System.getProperty("path.separator")); for(final String element : classPathElements){ retval.addAll(getResources(element, pattern)); } return retval; } private static Collection<String> getResources( final String element, final Pattern pattern){ final ArrayList<String> retval = new ArrayList<String>(); final File file = new File(element); if(file.isDirectory()){ retval.addAll(getResourcesFromDirectory(file, pattern)); } else{ retval.addAll(getResourcesFromJarFile(file, pattern)); } return retval; } private static Collection<String> getResourcesFromJarFile( final File file, final Pattern pattern){ final ArrayList<String> retval = new ArrayList<String>(); ZipFile zf; try{ zf = new ZipFile(file); } catch(final ZipException e){ throw new Error(e); } catch(final IOException e){ throw new Error(e); } final Enumeration e = zf.entries(); while(e.hasMoreElements()){ final ZipEntry ze = (ZipEntry) e.nextElement(); final String fileName = ze.getName(); final boolean accept = pattern.matcher(fileName).matches(); if(accept){ retval.add(fileName); } } try{ zf.close(); } catch(final IOException e1){ throw new Error(e1); } return retval; } private static Collection<String> getResourcesFromDirectory( final File directory, final Pattern pattern){ final ArrayList<String> retval = new ArrayList<String>(); final File[] fileList = directory.listFiles(); for(final File file : fileList){ if(file.isDirectory()){ retval.addAll(getResourcesFromDirectory(file, pattern)); } else{ try{ final String fileName = file.getCanonicalPath(); final boolean accept = pattern.matcher(fileName).matches(); if(accept){ retval.add(fileName); } } catch(final IOException e){ throw new Error(e); } } } return retval; } /** * list the resources that match args[0] * * @param args * args[0] is the pattern to match, or list all resources if * there are no args */ public static void main(final String[] args){ Pattern pattern; if(args.length < 1){ pattern = Pattern.compile(".*"); } else{ pattern = Pattern.compile(args[0]); } final Collection<String> list = ResourceList.getResources(pattern); for(final String name : list){ System.out.println(name); } }}
If you are using Spring Have a look at PathMatchingResourcePatternResolver
Using Reflections
Get everything on the classpath:
Reflections reflections = new Reflections(null, new ResourcesScanner());Set<String> resourceList = reflections.getResources(x -> true);
Another example - get all files with extension .csv from some.package:
Reflections reflections = new Reflections("some.package", new ResourcesScanner());Set<String> resourceList = reflections.getResources(Pattern.compile(".*\\.csv"));