溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點(diǎn)擊 登錄注冊 即表示同意《億速云用戶服務(wù)條款》

SpringBoot怎么讀取classpath下的文件

發(fā)布時間:2021-06-16 13:46:20 來源:億速云 閱讀:868 作者:小新 欄目:開發(fā)技術(shù)

這篇文章主要介紹了SpringBoot怎么讀取classpath下的文件,具有一定借鑒價值,感興趣的朋友可以參考下,希望大家閱讀完這篇文章之后大有收獲,下面讓小編帶著大家一起了解一下。

SpringBoot 讀取classpath下文件

開發(fā)過程中,必不可少的需要讀取文件,對于打包方式的不同,還會存在一些坑,比如以jar包方式部署時,文件都存在于jar包中,某些讀取方式在開發(fā)工程中都可行,但是打包后,由于文件被保存在jar中,會導(dǎo)致讀取失敗。

這時就需要通過類加載器讀取文件,類加載器可以讀取jar包中的class類當(dāng)然也可以讀取jar包中的文件。

// 方法1:獲取文件或流
this.getClass().getResource("/")+fileName;
this.getClass().getResourceAsStream(failName);
// 方法2:獲取文件
File file = org.springframework.util.ResourceUtils.getFile("classpath:test.txt");
// 方法3:獲取文件或流
ClassPathResource classPathResource = new ClassPathResource("test.txt");
classPathResource .getFile();
classPathResource .getInputStream();
// >>>>>>>>>>>>>>>> 下面方法可以讀取jar包下文件
假設(shè)resources目錄下有一個test.txt文件,首先獲得當(dāng)前的類加載器,通過類加載器讀取文件。
// 方法1
InputStream io = Thread.currentThread().getContextClassLoader().getResourceAsStream("test.txt");
// 方法2
InputStream io = getClass().getClassLoader().getResourceAsStream("test.txt");

注意:

Spring工具類會對classpath路徑做處理,類加載器不會對classpath做處理,因此使用類加載器讀取文件,路徑中不要添加classpath

SpringBoot項(xiàng)目打包成jar后獲取classpath下文件失敗

公司的一個SpringBoot項(xiàng)目中,有需要下載文件模板的需求,按理來說分布式項(xiàng)目文件都應(yīng)該上傳到文件服務(wù)器,但是由于文件不是太多于是就放在了classpath下,在本地開發(fā)的時候發(fā)現(xiàn)都能正常下載文件,但是打包成jar上傳到Linxu測試環(huán)境上就報(bào)錯,找不到classpath路徑。

原因

原因是項(xiàng)目打包后Spring試圖訪問文件系統(tǒng)路徑,但無法訪問JAR包中的路徑。我們使用ResourceUtils.getFile("classpath:");這樣的方式是獲取不到路徑的。

解決方案

我們雖然不能直接獲取文件資源路徑,但是我們可以通過流的方式讀取資源,拿到輸入流過后我們就可以對其做操作了。關(guān)鍵代碼如下:

ClassPathResource resource = new ClassPathResource("\\static\\pattern\\test.txt");    // static/pattern下的 test.txt文件
InputStream in = resource.getInputStream();  //獲取文件輸入流

示例Demo

1. 在static下新建pattern目錄,并新建一個名為 test.txt的文件

SpringBoot怎么讀取classpath下的文件

2. 新建DownloadController.java

代碼如下:

package com.example.jekins.controller;
import org.springframework.core.io.ClassPathResource;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RestController;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import java.net.URLEncoder;
@RestController
public class DownloadController {
    @GetMapping("/download/pattern")
    public void downloadPattern(HttpServletRequest request, HttpServletResponse response){
        System.out.println("開始下載文件.....");
        ClassPathResource resource = new ClassPathResource("\\static\\pattern\\test.txt");
        try {
        	//獲取文件輸入流
            InputStream in = resource.getInputStream();
            //下載文件
            downFile("test文件.txt",request,response,in);
        } catch (IOException e) {
            e.printStackTrace();
        }
    }
    /**
     * 下載文件
     * @param fileName 下載文件名稱
     * @param response 響應(yīng)
     * @throws IOException 異常
     */
    public static void downFile(String fileName,HttpServletRequest request,
                                HttpServletResponse response,InputStream in) throws IOException {
        //輸出流自動關(guān)閉,java1.7新特性
        try(OutputStream os = response.getOutputStream()) {
            fileName = URLEncoder.encode(fileName, "UTF-8");
            response.reset();
            response.setHeader("Content-Disposition", "attachment; filename=" + fileName);
            response.setContentType("application/octet-stream; charset=UTF-8");
            byte[] b = new byte[in.available()];
            in.read(b);
            os.write(b);
            os.flush();
        } catch (Exception e) {
            System.out.println("fileName=" + fileName);
            e.printStackTrace();
        } finally {
            if (in != null) {
                in.close();
            }
        }
    }
}

3. 測試 使用Maven工具把項(xiàng)目打成jar包

SpringBoot怎么讀取classpath下的文件

在target下生成了jar包

SpringBoot怎么讀取classpath下的文件

進(jìn)入jar包所在的文件夾,按住shift并右擊,點(diǎn)擊在此處打開命令行窗口。輸入命令啟動項(xiàng)目 java -jar 打包后的文件

SpringBoot怎么讀取classpath下的文件

我設(shè)置的端口是8086,瀏覽器地址欄輸入http://127.0.0.1:8086/download/pattern

此時我們可以卡看到test.txt文件下載成功

SpringBoot怎么讀取classpath下的文件

感謝你能夠認(rèn)真閱讀完這篇文章,希望小編分享的“SpringBoot怎么讀取classpath下的文件”這篇文章對大家有幫助,同時也希望大家多多支持億速云,關(guān)注億速云行業(yè)資訊頻道,更多相關(guān)知識等著你來學(xué)習(xí)!

向AI問一下細(xì)節(jié)

免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點(diǎn)不代表本網(wǎng)站立場,如果涉及侵權(quán)請聯(lián)系站長郵箱:is@yisu.com進(jìn)行舉報(bào),并提供相關(guān)證據(jù),一經(jīng)查實(shí),將立刻刪除涉嫌侵權(quán)內(nèi)容。

AI