springboot打包后的文件讀取
在使用了springboot打包后的項目中,牽扯到項目目錄中文件讀取工作時,明明在開發時功能正常,但是一到發布到線上環境就會報文件找不到,路徑不存在的問題。
由于在開發過程中,文件就在我們本地目錄中存在,因此普通正常文件的讀寫功能不受影響,而一旦打包后,可能會由于我們自己的文件目錄放置原因一是沒有被正確打包到jar包中,第二個即使被打包進去,由于jar包并不會解壓到服務器中,因此如果我們按照正常的文件路徑去獲取文件的時候還是會報異常。
文件打包問題
首先是確認我們自己的文件有沒有被打包到jar包中,默認的如果文件在src/main/resources目錄下的時候是會打包的,但如果不在目錄中,我們可以通過在pom.xml中配置以下指明我們的資源文件所在。拿個mybatis的mapper.xml文件舉例,我們將沒有放到了java源碼目錄中了,則需要通過以下配置指定目錄所在
<build> <resources> <resource> <directory>src/main/java</directory> <includes> <include>**/*.xml</include> </includes> </resource> </resources> </build>
文件讀取問題
記住一個準則,凡是要通過路徑獲取文件的方法都會報錯,但是通過流的方式卻是可以工作的。我們拿spring提供的一個類org.springframework.core.io.ClassPathResource來解決讀取問題。
ClassPathResource classPathResource = new ClassPathResource(path); InputStream inputStream = classPathResource.getInputStream(); // 流獲取到了就可以做自己想要的讀取操作了
但是還有一些情況,我們就是要獲取文件然后做一些操作,比如我需要通過文件構造RandomAccessFile對象然后來實現某些功能,當然我目前還沒發現通過流來構造這個對象的,所以不知道還有沒有別的方法。
這種情況先獲取到流然后重新生成一個新的文件,然后我們最終讀取的是我們復制的那個文件,而不對原始文件操作,這樣這個文件就是在真實路徑中存在的。舉個簡單的代碼例子,我們在src/main/resources下有一個test.txt文件,我們可以在要讀取文件(要保證只執行一次)或者簡單粗暴在項目啟動的時候復制一下文件。
String path = "test.txt"; ClassPathResource classPathResource = new ClassPathResource(path); // 我們要將文件復制到服務器的某個目錄 String targetPath = "/app/file/test.txt"; // 通過原始文件流復制文件 Files.copy(classPathResource.getInputStream(), Paths.get(targetPath ), StandardCopyOption.REPLACE_EXISTING); // 然后通過復制的文件進行操作 new RandomAccessFile(targetPath, "r");
Springboot打包后讀取不到文件
SpringBoot部署后文件找不到的問題
項目引用了一個xml作為模板
本地訪問文件的時候使用的方式比較直接
Document document = reader.read(ResourceUtils.getURL("classpath:").getPath() + "xmlTemplate.xml");
直接訪問classpath下的xmlTemplate,這種方式在本地運行的時候能取到文件,但是項目在打包再發布以后,問題就出來了…
解決辦法1 失敗。。
在pom中的build中 直接配置resources
<build> <resources> <resource> <directory>src/main/java</directory> <includes> <include>**/*.xml</include> </includes> <filtering>true</filtering> </resource> <resource> <directory>src/main/resources</directory> <includes> <include>**/*.*</include> </includes> </resource> </resources> </build>
這個配置的作用是告訴maven哪些文件需要被打進包里。這時我看了一眼打好的jar包,確實里面是有我的文件的,但是此時代碼報錯 找不到文件。
解決辦法 2
換一種取文件的方式,因為已經確定打好的包中是有文件的新的方式
ClassPathResource resource = new ClassPathResource("xmlTemplate.xml"); Document document = reader.read(resource.getInputStream());
解決了..
以上為個人經驗,希望能給大家一個參考,也希望大家多多支持服務器之家。
原文鏈接:https://blog.csdn.net/yichen0429/article/details/106619329