Получить список ресурсов из каталога classpath - PullRequest
215 голосов
/ 13 октября 2010

Я ищу способ получить список всех имен ресурсов из заданного каталога classpath, что-то вроде метода List<String> getResourceNames (String directoryName).

Например, заданный каталог classpath x/y/z, содержащий файлы a.html, b.html, c.html и подкаталог d, getResourceNames("x/y/z") должен возвращать List<String>, содержащий следующие строки: ['a.html', 'b.html', 'c.html', 'd'].

Он должен работать как для ресурсов в файловой системе, так и для файловой системы.jars.

Я знаю, что могу написать быстрый фрагмент с File s, JarFile s и URL s, но я не хочу изобретать велосипед.Мой вопрос, учитывая существующие общедоступные библиотеки, каков самый быстрый способ реализации getResourceNames?Стеки Spring и Apache Commons возможны.

Ответы [ 11 ]

0 голосов
/ 16 мая 2016

Основываясь на информации @rob выше, я создал реализацию, которую я публикую в открытом доступе:

private static List<String> getClasspathEntriesByPath(String path) throws IOException {
    InputStream is = Main.class.getClassLoader().getResourceAsStream(path);

    StringBuilder sb = new StringBuilder();
    while (is.available()>0) {
        byte[] buffer = new byte[1024];
        sb.append(new String(buffer, Charset.defaultCharset()));
    }

    return Arrays
            .asList(sb.toString().split("\n"))          // Convert StringBuilder to individual lines
            .stream()                                   // Stream the list
            .filter(line -> line.trim().length()>0)     // Filter out empty lines
            .collect(Collectors.toList());              // Collect remaining lines into a List again
}

Хотя я не ожидал, что getResourcesAsStream будет работать так же в каталоге, это действительно так и работает хорошо.

...