如何在Spring Boot中讀取JAR包內resources目錄下文件

精心整理了最新的面試資料和簡歷模板,有需要的可以自行獲取

點擊前往百度網盤獲取
點擊前往夸克網盤獲取

以下是如何在Spring Boot中讀取JAR包內resources目錄下文件的教程,分為多種方法及詳細說明:


方法1:使用 ClassPathResource (Spring框架推薦)

適用于Spring環境,能自動處理類路徑資源。

import org.springframework.core.io.ClassPathResource;
import java.io.InputStream;
import org.apache.commons.io.IOUtils;public String readFileWithClassPathResource() throws IOException {// 指定文件路徑(相對于src/main/resources)ClassPathResource resource = new ClassPathResource("files/example.txt");try (InputStream inputStream = resource.getInputStream()) {// 將文件內容轉為字符串(需Apache Commons IO依賴)return IOUtils.toString(inputStream, StandardCharsets.UTF_8);}
}
注意事項:
  • 路徑無需以/開頭(如"files/example.txt")。
  • 文件應放在src/main/resources/files/example.txt

方法2:使用 ClassLoader.getResourceAsStream() (Java原生方法)

無需依賴Spring,適用于純Java環境。

public String readFileWithClassLoader() throws IOException {// 獲取ClassLoaderClassLoader classLoader = getClass().getClassLoader();// 指定文件路徑(路徑以"/"開頭表示從resources根目錄開始)try (InputStream inputStream = classLoader.getResourceAsStream("files/example.txt")) {if (inputStream == null) {throw new FileNotFoundException("文件未找到");}return new String(inputStream.readAllBytes(), StandardCharsets.UTF_8);}
}
注意事項:
  • 路徑是否以/開頭會影響查找位置:
    • classLoader.getResourceAsStream("files/example.txt"):從類路徑根目錄開始。
    • getClass().getResourceAsStream("/files/example.txt"):同上。
    • getClass().getResourceAsStream("files/example.txt"):從當前類所在包目錄開始。

方法3:使用 FilesPaths (Java 7+ NIO)

適用于需要Path對象操作的場景,但需注意JAR內文件的限制。

import java.nio.file.Files;
import java.nio.file.Paths;public String readFileWithNIO() throws IOException {// 通過ClassLoader獲取文件URLjava.net.URL url = getClass().getClassLoader().getResource("files/example.txt");if (url == null) {throw new FileNotFoundException("文件未找到");}// 轉換為URI后讀取return Files.readString(Paths.get(url.toURI()));
}
注意事項:
  • 直接使用Paths.get("src/main/resources/...")在JAR中會失敗,必須通過URL獲取路徑。

常見問題排查

  1. 文件路徑錯誤

    • 檢查文件是否在src/main/resources的正確子目錄中。
    • 使用IDE的“Build”或“Maven/Gradle編譯”后查看target/classesbuild/resources確認文件是否被正確打包。
  2. JAR中無法讀取

    • 使用jar tf your-app.jar命令檢查文件是否存在于JAR內。
    • 確保使用getResourceAsStreamClassPathResource,而非FileInputStream
  3. 空指針異常

    • 檢查getResourceAsStream()返回的InputStream是否為null,并在代碼中處理。

文件位置示例

src/main/resources
├── application.properties
└── files└── example.txt  # 讀取路徑為 "files/example.txt"

總結

  • 推薦方法:優先使用ClassPathResource(Spring項目)或ClassLoader.getResourceAsStream()(純Java)。
  • 避免使用new File("path")FileInputStream,這些在JAR中無法工作。
  • 測試驗證:在打包后通過java -jar your-app.jar運行并測試文件讀取功能。

通過上述方法,你可以安全地讀取JAR包內resources目錄下的文件內容。

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/web/71481.shtml
繁體地址,請注明出處:http://hk.pswp.cn/web/71481.shtml
英文地址,請注明出處:http://en.pswp.cn/web/71481.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

清華大學DeepSeek賦能家庭教育【附下載鏈接】

核心要點: DeepSeek通過基礎模型(V3)、深度思考模型(R1)及聯網模型,為家庭教育提供分層支持:V3用于作業輔導,R1培養批判性思維,聯網模型助力探究性學習。家長需遵循目標導…

C語言番外篇(5)-------------->作用域與生命周期

作用域與生命周期是非常重要的編程知識。本篇文章使用C語言講述作用域與生命周期。 一、作用域 在程序設計中,變量并非總是有效的,可以使用的區域就是作用域。 1.1局部變量的作用域 在{}中的都是局部變量,只是作用大小不一樣而已。我們可…

若依前后端分離版使用Electron打包前端Vue為Exe文件

1.前言 本文詳細介紹如何使用electron將若依框架前后端分離版的前端Vue頁面打包為Exe文件,并且包括如何實現應用更新。使用若依基礎代碼體現不出打包功能,因此我使用開發的文件管理系統,介紹上述過程,具體可以查看我的文章《若依…

Linux——Docker容器內MySQL密碼忘記了如何查看

目錄 查看正在運行的MySQL的容器ID 方法一:查看MySQL容器的日志里的密碼 方法二:通過環境變量密碼登錄 方法三:修改密碼 查看正在運行的MySQL的容器ID docker ps 方法一:查看MySQL容器的日志里的密碼 docker logs [MySQL的容器…

康謀分享 | 3DGS:革新自動駕駛仿真場景重建的關鍵技術

隨著自動駕駛技術的迅猛發展,構建高保真、動態的仿真場景成為了行業的迫切需求。傳統的三維重建方法在處理復雜場景時常常面臨效率和精度的挑戰。在此背景下,3D高斯點陣渲染(3DGS)技術應運而生,成為自動駕駛仿真場景重…

大模型架構記錄2

一 應用場景 1.1 prompt 示例 1.2 自己搭建一個UI界面,調用接口 可以選用不同的模型,需要對應的API KEY 二 Agent 使用 2.1 構建GPT

【C++】二叉樹相關算法題

一、根據二叉樹創建字符串 題目描述: 給你二叉樹的根節點 root ,請你采用前序遍歷的方式,將二叉樹轉化為一個由括號和整數組成的字符串,返回構造出的字符串。 空節點使用一對空括號對 “()” 表示,轉化后需要省略所有…

【機械視覺】C#+visionPro聯合編程———【一、C# + VisionPro 聯合編程詳解以及如何將visionPro工具加載到winform】

機械視覺與 C# VisionPro 聯合編程詳解 目錄 機械視覺與 C# VisionPro 聯合編程詳解 概念 應用場景 1. 工業檢測與質量控制缺陷檢測 2. 定位與機器人引導 3. 識別與分類 4. 復雜流程控制 將visionPro工具加載到winform 環境準備 一、創建winform項目 二、打開窗體…

修改hosts文件,修改安全屬性,建立自己的DNS

初級代碼游戲的專欄介紹與文章目錄-CSDN博客 我的github:codetoys,所有代碼都將會位于ctfc庫中。已經放入庫中我會指出在庫中的位置。 這些代碼大部分以Linux為目標但部分代碼是純C的,可以在任何平臺上使用。 源碼指引:github源…

對NXP提供的BSP里邊所使用的u-boot的環境變量`bootcmd`的解析

為什么我們要解析環境變量bootcmd? 承接博文 https://blog.csdn.net/wenhao_ir/article/details/145902134 繼續解析u-boot的環境變量bootcmd。 為什么要解析u-boot的這個環境變量bootcmd?因為如果u-boot在倒計時完后,首先執行的是就是下面這條命令&am…

NSSCTF [SWPUCTF 2024 秋季新生賽]金絲雀

5948.[SWPUCTF 2024 秋季新生賽]金絲雀 canary繞過和64位的ret2libc(格式化字符串泄露) (1) motalymotaly-VMware-Virtual-Platform:~/桌面$ file xn xn: ELF 64-bit LSB executable, x86-64, version 1 (SYSV), dynamically linked, interpreter /lib64/ld-linux-x86-64.so.…

神經網絡中梯度計算求和公式求導問題

以下是公式一推導出公式二的過程。 表達式一 ? E ? w j k ? 2 ( t k ? o k ) ? sigmoid ( ∑ j w j k ? o j ) ? ( 1 ? sigmoid ( ∑ j w j k ? o j ) ) ? ? ? w j k ( ∑ j w j k ? o j ) \frac{\partial E}{\partial w_{jk}} -2(t_k - o_k) \cdot \text{sigm…

koa-session設置Cookie后獲取不到

在谷歌瀏覽器中請求獲取不到cookie問題之一(谷歌安全策略) 場景 前端使用 axios 請求,項目地址:http://192.168.8.1:5173 import axios from axiosconst request axios.create({baseURL: http://127.0.0.1:3001/,timeout: 60000,…

單元測試與仿真程序之間的選擇

為什么寫這篇文章 現在的工作需求,讓我有必要總結和整理一下。 凡事都有適用的場景。首先這里我需要提示一下,這里的信息,可能并不普適。 但是可以肯定一點的是,有些人,不論做事還是寫書,上下文還沒有交待…

如何在Android中實現圖片加載和緩存

在Android中實現圖片加載和緩存是提升應用性能和用戶體驗的關鍵環節。高效的圖片加載和緩存策略能夠減少內存占用、避免應用卡頓,并快速響應用戶的圖片查看需求。以下是在Android中實現圖片加載和緩存的幾種常見方法: 一、使用第三方圖片加載庫 1. Gli…

FusionInsight MRS云原生數據湖

FusionInsight MRS云原生數據湖 1、FusionInsight MRS概述2、FusionInsight MRS解決方案3、FusionInsight MRS優勢4、FusionInsight MRS功能 1、FusionInsight MRS概述 1.1、數據湖概述 數據湖是一個集中式存儲庫,允許以任意規模存儲所有結構化和非結構化數據。可以…

推薦幾款優秀的PDF轉電子畫冊的軟件

當然可以!以下是幾款優秀的PDF轉電子畫冊的軟件推薦,內容簡潔易懂,這些軟件都具有易用性和互動性,適合不同需求的用戶使用。? ? FLBOOK|在線創作平臺 支持PDF直接導入生成仿真翻頁電子書。提供15主題模板與字體庫&a…

【GoTeams】-2:項目基礎搭建(下)

本文目錄 1. 回顧2. Zap日志3. 配置4. 引入gprc梳理gRPC思路優雅關閉gRPC 1. 回顧 上篇文章我們進行了路由搭建,引入了redis,現在來看看對應的效果。 首先先把前端跑起來,然后點擊注冊獲取驗證碼。 再看看控制臺輸出和redis是否已經有記錄&…

深度學習反向傳播

一、白話解釋 梯度其實就是導數,除了用符號求導也可以用近似求導: 然后更新ww-學習率*導數 反向傳播就是鏈式求導 向前計算:對每個節點求偏導 在前向傳播的時候,進行一次前向計算的時候就可以把每一條線的偏導數都知道 前向傳…

JavaWeb-HttpServletRequest請求域接口

文章目錄 HttpServletRequest請求域接口HttpServletRequest請求域接口簡介關于請求域和應用域的區別 請求域接口中的相關方法獲取前端請求參數(getParameter系列方法)存儲請求域名參數(Attribute系列方法)獲取客戶端的相關地址信息獲取項目的根路徑 關于轉發和重定向的細致剖析…