В приложениях SpringBoot часто необходимо читать файлы ресурсов, упакованные в пакеты jar, такие как файлы конфигурации, файлы шаблонов и т. д. Эти файлы ресурсов обычно размещаются в каталоге src/main/resources. После упаковки в пакет jar они сохраняются в корневом каталоге пакета jar. В этой статье будут представлены 4 метода чтения этих файлов ресурсов в SpringBoot.
После развертывания проект запускается как jar-пакет, и файлы внутри не имеют реальных путей (только относительные пути относительно имени проекта).
Это общедоступный метод, используемый для чтения содержимого файла с помощью метода T.class.getClassLoader().getResourceAsStream().
Например, чтобы прочитать файл test.properties в папке конфигурации:
public static void printFileContent(Object obj) throws IOException {
if (null == obj) {
throw new RuntimeException("Параметр пуст");
}
BufferedReader reader = null;
// если это путь к файлу
if (obj instanceof String) {
reader = new BufferedReader(new FileReader(new File((String) obj)));
// если это поток ввода файла
} else if (obj instanceof InputStream) {
reader = new BufferedReader(new InputStreamReader((InputStream) obj));
}
String line = null;
while ((line = reader.readLine()) != null) {
System.out.println(line);
}
reader.close();
}
Этот метод ищет файлы по пути к классам (т. е. по пути к источнику или ресурсам), поэтому нет необходимости добавлять «/» перед путем.
Метод чтения:
public class ResourceUtil {
public void getResource(String fileName) throws IOException{
InputStream in = this.getClass().getClassLoader().getResourceAsStream(fileName);
printFileContent(in);
}
public static void main(String[] args) throws IOException {
new ResourceUtil().getResource("config/test.properties");
}
}
public void getResource2(String fileName) throws IOException{
InputStream in = this.getClass().getResourceAsStream("/" + fileName);
printFileContent(in);
}
public static void main(String[] args) throws IOException {
new ResourceUtil().getResource2("config/test.properties");
}
Этот метод основан на classpath путь (т. е.: источник или resources путь), но ему должен предшествовать путь “/” ,Это связано с прочитанным файлом и текущим .class Зависит от местоположения файла.
Вы можете посмотреть путь к скомпилированному файлу:
Расположение текущего файла ResourceUtil.class и загружаемого файла test.properties следующее: test.properties и ResourceUtil.class не находятся в одной папке, поэтому при чтении необходимо указать относительный путь. ситуация с двумя последствиями:
public void getResource3(String fileName) throws IOException{
ClassPathResource classPathResource = new ClassPathResource(fileName);
printFileContent(classPathResource.getInputStream());
}
public static void main(String[] args) throws IOException {
new ResourceUtil().getResource3("config/test.properties");
}
SpringBoot предоставляет аннотацию @Value, которую можно использовать для внедрения значений в файлы конфигурации, включая чтение из файлов ресурсов в jar-пакетах.
import org.springframework.beans.factory.annotation.Value;
import org.springframework.stereotype.Component;
@Component
public class ConfigPropertiesReader {
@Value("${app.config.value}")
private String configValue;
public void printConfigValue() {
System.out.println("Config Value: " + configValue);
}
}
В файле application.propertiesилиapplication.yml вы можете указать расположение файла ресурсов следующим образом:
app.config.value=classpath:config.properties