天天看點

java工程内部檔案路徑讀取問題jar:file:\No such file or directory

今天發現一個問題,在本地的開發環境下可以讀取.pptx檔案。但是部署到測試環境或者開發環境就會報錯,因為此時這個.pptx檔案被打成jar包了。導緻讀取檔案時無法讀取。一旦被打入jar包,path就變為了jar:file:\usr\local\product\jar\product-controller-0.0.1-SNAPSHOT.jar!\BOOT-INF\classes!\template\service_proposal_template.pptx,進而無法讀取到對應jar中的檔案位址。

通過以下這種方式去擷取工程檔案中的資源位址

        URL classPath = Thread.currentThread().getContextClassLoader().getResource("");

        //模闆檔案路徑

        String proFilePath = classPath.toString();

        //移除開通的file:/六個字元

        proFilePath = proFilePath.substring(6) + "template/" + ProductContant.SERVICE_PROPOSAL_TEMPLATE_NAME + ".pptx";

        File file = new File(proFilePath);

        InputStream powerPoint = new FileInputStream(file);

會報如下錯誤:

2017-12-12 12:16:19.181 ERROR com.xxx.product.application.ControllerAdvice 24 errorHandler -- le:/usr/local/product/jar/product-controller-0.0.1-SNAPSHOT.jar!/BOOT-INF/classes!/template/service_proposal_template.pptx (No such file or directory)

exception='java.io.FileNotFoundException: le:/usr/local/atme-product/jar/atme-product-controller-0.0.1-SNAPSHOT.jar!/BOOT-INF/classes!/template/service_proposal_template.pptx (No such file or directory)

解決方案:

不讀取工程中的檔案位址,直接将對應檔案轉化為二進制流進行操作。

InputStream is = this.getClass().getClassLoader().getResourceAsStream("template/service_proposal_template.pptx");           
InputStream powerPoint = new FileInputStream(is);