Dies ist ein Memo, als ich über den Zugriff auf Ressourcendateien mithilfe der Ressourcenschnittstelle und der Implementierungsklasse von Spring Framework nachdachte.
Umgebung
Referenz
Since 28.12.2003
Interface for a resource descriptor that abstracts from the actual type of underlying resource, such as a file or class path resource.
So erhalten Sie eine Instanz der Ressourcenschnittstelle
@ Value
Und so weiter.
Verwendung der entsprechenden Implementierungsklasse für die Ressourcenschnittstelle in Abhängigkeit vom Speicherort der Ressourcendatei. Beispielsweise gibt es "ClassPathResource" für den Zugriff auf Ressourcen im Klassenpfad, "UrlResource" für den Zugriff auf Ressourcen im Netzwerk und "FileUrlResource" für den Zugriff auf Ressourcen im Dateisystem.
Since 28.12.2003
Resource implementation for class path resources. Uses either a given ClassLoader or a given Class for loading resources.
Konstrukteur |
---|
ClassPathResource(String path) |
ClassPathResource(String path, Class<?> clazz) |
ClassPathResource(String path, ClassLoader classLoader) |
Code
Resource resource = new ClassPathResource("config/app.properties");
Da die Ressourcenschnittstelle von der InputStreamSource-Schnittstelle erbt, können Sie den InputStream der Ressourcendatei mit der Methode getInputStream abrufen.
String read(Resource resource) {
try (InputStream in = resource.getInputStream();
BufferedReader reader = new BufferedReader(new InputStreamReader(in, StandardCharsets.UTF_8))) {
StringBuilder sb = new StringBuilder();
String line = null;
while ((line = reader.readLine()) != null) {
sb.append(line);
}
return sb.toString();
} catch (IOException e) {
throw new UncheckedIOException(e);
}
}
Da die Ressourcenschnittstelle auch über eine getFile-Methode verfügt, kann diese wie folgt beschrieben werden. Da jedoch eine Ausnahme ausgelöst wird, wenn sich die Ressource im Klassenpfad oder im Netzwerk befindet, befindet sich die Ressourcendatei normalerweise im Dateisystem. Ich denke, Sie sollten es nur in bestimmten Fällen verwenden.
String read(Resource resource) {
try {
return Files.readString(resource.getFile().toPath());
} catch (IOException e) {
throw new UncheckedIOException(e);
}
}
Since 28.12.2003
Resource implementation for java.net.URL locators. Supports resolution as a URL and also as a File in case of the "file:" protocol.
Konstrukteur |
---|
UrlResource(String path) |
UrlResource(String protocol, String location) |
UrlResource(String protocol, String location, String fragment) |
UrlResource(java.net.URI uri) |
UrlResource(java.net.URL url) |
Code
Resource urlResource = new UrlResource("http://localhost:8887/config/app.properties");
Since 5.0.2
Subclass of UrlResource which assumes file resolution, to the degree of implementing the WritableResource interface for it. This resource variant also caches resolved File handles from getFile().
Konstrukteur |
---|
FileUrlResource(String location) |
FileUrlResource(java.net.URL url) |
Code
Resource fileUrlResource = new FileUrlResource("c://var//config/app.properties");
Since 10.03.2004
Strategy interface for loading resources (e.. class path or file system resources). An ApplicationContext is required to provide this functionality, plus extended ResourcePatternResolver support. DefaultResourceLoader is a standalone implementation that is usable outside an ApplicationContext, also used by ResourceEditor.
ResourceLoader Instanz der Ressource unter Verwendung der Implementierungsklasse der Schnittstelle Wenn Sie erhalten, besteht der Vorteil, dass Sie die Implementierungsklasse der Ressourcenschnittstelle nicht kennen müssen.
Beim Spring Boot wird ResourceLoader eine Instanz der Klasse "AnnotationConfigServletWebServerApplicationContext" injiziert. (Diese Klasse befindet sich im Spring Boot-Projekt.)
@Autowired
private ResourceLoader resourceLoader;
// org.springframework.boot.web.servlet.context.AnnotationConfigServletWebServerApplicationContext
classpath
Schreiben beginnend mit "classpath:" fügt eine Instanz der "ClassPathResource" -Klasse ein.
Resource resource = resourceLoader.getResource("classpath:config/app.properties");
// org.springframework.core.io.ClassPathResource
url
Wenn Sie es in das http-Schema schreiben, wird eine Instanz der UrlResource-Klasse eingefügt.
Resource resource = resourceLoader.getResource("http://localhost:8887/config/app.properties");
// org.springframework.core.io.UrlResource
file
Eine Instanz der Klasse "FileUrlResource" wird wie im Dateischema beschrieben eingefügt.
Resource resource = resourceLoader.getResource("file:///c://config/app.properties");
// org.springframework.core.io.FileUrlResource
Abhängig vom Wert der Value-Annotation fügt das Spring Framework eine Instanz der entsprechenden Implementierungsklasse ein. Das Format des in der Anmerkung beschriebenen Werts entspricht dem von ResourceLoader.
classpath
@Value("classpath:config/app.properties")
private Resource classpathResource;
// org.springframework.core.io.ClassPathResource
url
@Value("http://localhost:8887/config/app.properties")
private Resource urlResource;
// org.springframework.core.io.UrlResource
file
@Value("file:///c://config/app.properties")
private Resource fileUrlResource;
// org.springframework.core.io.FileUrlResource
Since 1.1.5
Utility methods for resolving resource locations to files in the file system. Mainly for internal use within the framework.
Wie in der API-Dokumentation beschrieben, handelt es sich um eine Dienstprogrammklasse, die hauptsächlich im Spring Framework verwendet wird. Es gibt keine Aussage, dass es nicht auf der Anwendungsseite verwendet werden sollte, aber es sollte mit Vorsicht verwendet werden, da es für die Verwendung innerhalb des Frameworks vorgesehen ist.
classpath
File file = ResourceUtils.getFile("classpath:config/app.properties");
url
URL url = ResourceUtils.getURL("http://localhost:8887/config/app.properties");
file
File file = ResourceUtils.getFile("file:///c://var//config/app.properties");
Since 3.2.2
Simple utility methods for dealing with streams. The copy methods of this class are similar to those defined in FileCopyUtils except that all affected streams are left open when done. All copy methods use a block size of 4096 bytes. Mainly for use within the framework, but also useful for application code.
Das Spring Framework verfügt auch über Dienstprogrammklassen, die Streams verarbeiten. Sie können die copyToString-Methode dieser Klasse verwenden, um Ihren Code wie folgt zu vereinfachen:
String data = StreamUtils.copyToString(resource.getInputStream(), StandardCharsets.UTF_8);
Recommended Posts