Get a list of resources from classpath directory Get a list of resources from classpath directory java java

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"));