在下面,您将找到在WAR和JAR中加载文件的解决方案。
资源加载器
使用Java,您可以使用当前线程的classLoader并尝试加载文件,但是Spring Framework为您提供了更为优雅的解决方案,例如ResourceLoader。
您只需要自动连接ResourceLoader,然后调用getResource(„somePath“)方法即可。
在Spring Boot(WAR)中从资源目录/类路径加载文件的示例
在以下示例中,我们从类路径中加载名为GeoLite2-Country.mmdb的文件作为资源,然后将其作为File对象检索。
- @Service("geolocationservice")
- public class GeoLocationServiceImpl implements GeoLocationService {
- private static final Logger LOGGER = LoggerFactory.getLogger(GeoLocationServiceImpl.class);
- private static DatabaseReader reader = null;
- private ResourceLoader resourceLoader;
- @Autowired
- public GeoLocationServiceImpl(ResourceLoader resourceLoader) {
- this.resourceLoader = resourceLoader;
- } @PostConstruct
- public void init() {
- try {
- LOGGER.info("GeoLocationServiceImpl: Trying to load GeoLite2-Country database...");
- Resource resource = resourceLoader.getResource("classpath:GeoLite2-Country.mmdb");
- File dbAsFile = resource.getFile(); // Initialize the reader
- reader = new DatabaseReader
- .Builder(dbAsFile)
- .fileMode(Reader.FileMode.MEMORY)
- .build();
- LOGGER.info("GeoLocationServiceImpl: Database was loaded successfully.");
- } catch (IOException | NullPointerException e) {
- LOGGER.error("Database reader cound not be initialized. ", e);
- }
- }
- @PreDestroy
- public void preDestroy() {
- if (reader != null) {
- try {
- reader.close();
- } catch (IOException e) {
- LOGGER.error("Failed to close the reader.");
- }
- }
- }
- }
在Spring Boot(JAR)中从资源目录/类路径加载文件的示例
如果您想从Spring Boot JAR中的 classpath加载文件,则必须使用该resource.getInputStream()方法将其作为InputStream检索。如果尝试使用resource.getFile()该方法,则会收到错误消息,因为Spring尝试访问文件系统路径,但无法访问JAR中的路径。
- @Service("geolocationservice")
- public class GeoLocationServiceImpl implements GeoLocationService {
- private static final Logger LOGGER = LoggerFactory.getLogger(GeoLocationServiceImpl.class);
- private static DatabaseReader reader = null;
- private ResourceLoader resourceLoader;
- @Inject
- public GeoLocationServiceImpl(ResourceLoader resourceLoader) {
- this.resourceLoader = resourceLoader;
- } @PostConstruct
- public void init() {
- try {
- LOGGER.info("GeoLocationServiceImpl: Trying to load GeoLite2-Country database...");
- Resource resource = resourceLoader.getResource("classpath:GeoLite2-Country.mmdb");
- InputStream dbAsStream = resource.getInputStream(); // <-- this is the difference
- // Initialize the reader
- reader = new DatabaseReader
- .Builder(dbAsStream)
- .fileMode(Reader.FileMode.MEMORY)
- .build();
- LOGGER.info("GeoLocationServiceImpl: Database was loaded successfully.");
- } catch (IOException | NullPointerException e) {
- LOGGER.error("Database reader cound not be initialized. ", e);
- }
- }
- @PreDestroy
- public void preDestroy() {
- if (reader != null) {
- try {
- reader.close();
- } catch (IOException e) {
- LOGGER.error("Failed to close the reader.");
- }
- }
- }
- }
文章题目:在SpringBoot中从类路径加载文件
分享链接:http://www.shufengxianlan.com/qtweb/news39/350889.html
网站建设、网络推广公司-创新互联,是专注品牌与效果的网站制作,网络营销seo公司;服务项目有等
声明:本网站发布的内容(图片、视频和文字)以用户投稿、用户转载内容为主,如果涉及侵权请尽快告知,我们将会在第一时间删除。文章观点不代表本网站立场,如需处理请联系客服。电话:028-86922220;邮箱:631063699@qq.com。内容未经允许不得转载,或转载时需注明来源: 创新互联