Greifen Sie über den Klassenpfad in einer Spring-Anwendung auf eine Datei zu

1. Einleitung

In diesem Tutorial werden verschiedene Möglichkeiten gezeigt, wie Sie mit Spring auf den Inhalt einer Datei zugreifen und diese laden können, die sich im Klassenpfad befindet.

2. Ressource verwenden

Die Ressourcenschnittstelle hilft bei der Zusammenfassung des Zugriffs auf Ressourcen auf niedriger Ebene. Tatsächlich unterstützt es den einheitlichen Umgang mit allen Arten von Dateiressourcen.

Schauen wir uns zunächst verschiedene Methoden an, um eine Ressourceninstanz zu erhalten .

2.1. Manuell

Für den Zugriff auf eine Ressource über den Klassenpfad können wir einfach ClassPathResource verwenden :

public Resource loadEmployeesWithClassPathResource() { return new ClassPathResource("data/employees.dat"); }

Standardmäßig entfernt ClassPathResource einige Boilerplates für die Auswahl zwischen dem Kontextklassenlader des Threads und dem Standardsystemklassenlader.

Wir können jedoch auch den Klassenlader angeben, der entweder direkt verwendet werden soll:

return new ClassPathResource("data/employees.dat", this.getClass().getClassLoader());

Oder indirekt über eine bestimmte Klasse:

return new ClassPathResource( "data/employees.dat", Employee.class.getClassLoader());

Beachten Sie, dass wir von Resource aus problemlos zu Java-Standarddarstellungen wie InputStream oder File springen können .

Eine andere Sache, die hier zu beachten ist, ist, dass die obige Methode nur für absolute Pfade funktioniert. Wenn Sie einen relativen Pfad angeben möchten, können Sie ein Argument der zweiten Klasse übergeben . Der Pfad ist relativ zu dieser Klasse:

new ClassPathResource("../../../data/employees.dat", Example.class).getFile();

Der obige Dateipfad ist relativ zur Example- Klasse .

2.2. Verwenden von @Value

Wir können auch eine injizieren Ressource mit @Value :

@Value("classpath:data/resource-data.txt") Resource resourceFile;

Und @Value unterstützt auch andere Präfixe wie file: und url : .

2.3. ResourceLoader verwenden

Wenn wir unsere Ressource träge laden möchten, können wir ResourceLoader verwenden :

@Autowired ResourceLoader resourceLoader;

Und dann rufen wir unsere Ressource mit getResource ab :

public Resource loadEmployeesWithResourceLoader() { return resourceLoader.getResource( "classpath:data/employees.dat"); }

Beachten Sie auch, dass ResourceLoader von allen konkreten ApplicationContext- Systemen implementiert wird. Dies bedeutet, dass wir uns auch einfach auf ApplicationContext verlassen können, wenn dies besser zu unserer Situation passt:

ApplicationContext context; public Resource loadEmployeesWithApplicationContext() { return context.getResource("classpath:data/employees.dat"); }

3. Verwenden von ResourceUtils

Als Einschränkung gibt es eine andere Möglichkeit, Ressourcen im Frühjahr abzurufen, aber dem ResourceUtils Javadoc ist klar, dass die Klasse hauptsächlich für den internen Gebrauch bestimmt ist.

Wenn wir die Verwendung von ResourceUtils in unserem Code sehen:

public File loadEmployeesWithSpringInternalClass() throws FileNotFoundException { return ResourceUtils.getFile( "classpath:data/employees.dat"); }

Wir sollten die Gründe sorgfältig prüfen, da es wahrscheinlich besser ist, einen der oben genannten Standardansätze zu verwenden .

4. Ressourcendaten lesen

Sobald wir eine Ressource haben, können wir den Inhalt leicht lesen. Wie bereits erläutert, können wir auf einfache Weise eine Datei oder eine InputStream- Referenz aus der Ressource abrufen .

Stellen wir uns vor, wir haben die folgende Datei, data / employee.dat , im Klassenpfad :

Joe Employee,Jan Employee,James T. Employee

4.1. Lesen als Datei

Jetzt können wir den Inhalt lesen, indem wir getFile aufrufen :

@Test public void whenResourceAsFile_thenReadSuccessful() throws IOException { File resource = new ClassPathResource( "data/employees.dat").getFile(); String employees = new String( Files.readAllBytes(resource.toPath())); assertEquals( "Joe Employee,Jan Employee,James T. Employee", employees); }

Beachten Sie jedoch, dass bei diesem Ansatz erwartet wird, dass die Ressource im Dateisystem und nicht in einer JAR-Datei vorhanden ist.

4.2. Lesen als InputStream

Sagen wir aber, dass unsere Ressource ist in einem Glas.

Dann können wir stattdessen eine Ressource als InputStream lesen :

@Test public void whenResourceAsStream_thenReadSuccessful() throws IOException { InputStream resource = new ClassPathResource( "data/employees.dat").getInputStream(); try ( BufferedReader reader = new BufferedReader( new InputStreamReader(resource)) ) { String employees = reader.lines() .collect(Collectors.joining("\n")); assertEquals("Joe Employee,Jan Employee,James T. Employee", employees); } }

5. Schlussfolgerung

In diesem kurzen Artikel haben wir einige Möglichkeiten gesehen, wie Sie mit Spring über den Klassenpfad auf eine Ressource zugreifen und diese lesen können, einschließlich des eifrigen und verzögerten Ladens und im Dateisystem oder in einem Glas.

Und wie immer habe ich all diese Beispiele auf GitHub gepostet.