在Spring Boot中從類路徑載入檔案解決方案

安全劍客發表於2020-10-29
建立Spring Boot Web應用程式時,有時有時需要從類路徑中載入檔案;war和jar的載入檔案格式是不一樣的,在下面,您將找到在WAR和JAR中載入檔案的解決方案。
資源載入器

使用Java,您可以使用當前執行緒的classLoader並嘗試載入檔案,但是Spring Framework為您提供了更為優雅的解決方案,例如ResourceLoader。

您只需要自動連線ResourceLoader,然後呼叫getResource(„somePath“)方法即可。

在Spring Boot中從類路徑載入檔案解決方案在Spring Boot中從類路徑載入檔案解決方案

在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."); 
            } 
        } 
    } 
}

原文地址:

來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/31559985/viewspace-2731013/,如需轉載,請註明出處,否則將追究法律責任。

相關文章