Является ли spring Resource файлом или каталогом? - PullRequest
0 голосов
/ 03 июня 2011

Я использую Spring Resource API и использую ResourcePatternResolver для сканирования моего пути к классам для поиска файлов.

В одной ситуации при сканировании выбираются некоторые каталоги и файлы, которые находятся в предварительно построенном фляге, и некоторые, которыенаходятся в файловой системе.

В любом случае «ресурс» будет либо файлом, либо каталогом.Как я могу надежно определить, указывает ли ресурс на каталог или файл, в файле JAR или нет?Вызов getFile() для ресурса внутри банки вызывает исключение, поэтому я не могу использовать это плюс isFile(), как я изначально пытался.

Ответы [ 3 ]

1 голос
/ 30 сентября 2015

Интерфейс Spring * Resource предназначен для того, чтобы стать более функциональным интерфейсом для абстрагирования доступа к низкоуровневым ресурсам.

Иногда он оборачивает файл, а иногда нет.в орудиях: UrlResource, ClassPathResource, FileSystemResource, ServletContextResource, InputStreamResource, ByteArrayResource.

Вы можете самостоятельно реализовать форму ресурса.

UrlResourceпереносит java.net.URL и может использоваться для доступа к любому объекту, который обычно доступен через URL.Если вы используете префикс http:, ресурсом является URL.

ClassPathResource представляет ресурс, который следует получить из пути к классам.Эта реализация Resource поддерживает разрешение как java.io.File, если ресурс пути к классу находится в файловой системе, но не для ресурсов пути к классам, которые находятся в jar-файле и не были расширены (механизмом сервлета или любой другой средой) дофайловая система.Для решения этой проблемы различные реализации Resource всегда поддерживают разрешение как java.net.URL.

FileSystemResource - это средство для ручек java.io.File. Очевидно, что оно поддерживает разрешение как File и как URL.

InputStreamResource является ресурсом реализации для данного InputStream.Не используйте его, если вам нужно где-то хранить дескриптор ресурса или если вам нужно прочитать поток несколько раз.

ByteArrayResource - это Resource реализация для данного байтового массива.Он создает ByteArrayInputStream для данного байтового массива.

Таким образом, вы не всегда должны использовать getFile(), так как Resource Spring не всегда представляет ресурс файловой системы. По этой причине мы рекомендуем использовать getInputStream() для доступа к содержимому ресурса, поскольку оно может функционировать для всех возможных типов ресурсов.

См. : Resources

0 голосов
/ 09 октября 2017

У меня было похожее требование, и я решил его, исключив каталоги из моего шаблона поиска.Затем для каждого найденного ресурса я ищу родительский элемент в пути и проверяю, был ли создан каталог перед записью файла.
В моем случае файл может находиться в файловой системе или в classpath, поэтому я проверяю схемусначала URI ..

Хотя мой шаблон поиска может по-прежнему извлекать каталоги, если в имени есть точка, поэтому в этом случае было бы лучше перехватить исключение -
шаблон поиска - classpath*:/**/sprout/plugins/**/*.*

Пример кода -

private void extractClientPlugins() throws IOException {
    Resource[] resourcePaths = resolver.getResourcePaths(sproutPluginSearchPattern);
    Path pluginFolderPath = Paths.get(sproutHome, "./plugins/");
    pluginFolderPath.toFile().mkdirs();
    if (resourcePaths.length == 0) {
        log.info("No Sprout client side plugins found");
    }
    for (Resource resource : resourcePaths) {
        try {
            Path destinationPath = generateDestinationPath(pluginFolderPath, resource);
            File parentFolder = destinationPath.getParent().toFile();
            if (!parentFolder.exists()) {
                parentFolder.mkdirs();
            }
            destinationPath.toFile().mkdirs();
            copy(resource, destinationPath.toFile());
        } catch (IOException e) {
            log.error("could not access resource", e);
            throw e;
        }
    }
}

private Path generateDestinationPath(Path rootDir, Resource resource) throws IOException {
    String relativePath = null;
    String scheme = resource.getURI().getScheme();
    if ("JAR".contains(scheme.toUpperCase())) {
        String[] uriParts = resource.getURL().toString().split("!");
        relativePath = trimPluginPathPrefix(uriParts[1]);
    } else {
        String filePath = resource.getFile().getAbsolutePath();
        relativePath = trimPluginPathPrefix(filePath);
    }
    return Paths.get(rootDir.toString(), relativePath);
}

private String trimPluginPathPrefix(String filePath) {
    String[] pathParts = filePath.split("sprout/plugins/");
    if (pathParts.length != 2) {
        throw new RuntimeException("The plugins must be located in a path containing '**/sprout/plugins/*'");
    }
    return pathParts[1];
}  

Использование его в этом проекте -
https://github.com/savantly-net/sprout-platform/blob/master/sprout-core/src/main/java/net/savantly/sprout/core/ui/UiLoader.java

0 голосов
/ 19 апреля 2012

Я думаю, вы можете просто окружить проверку кода для файла блоком try catch:

boolean isFile = true;

try {
   resource.getFile()
   ...
} catch (...Exception e) {
   ifFile = false
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...