成人免费xxxxx在线视频软件_久久精品久久久_亚洲国产精品久久久_天天色天天色_亚洲人成一区_欧美一级欧美三级在线观看

開發必備!Spring Boot 項目中 resources 文件讀取的九大方案詳解

開發 前端
不同的資源加載方式有不同的適用場景和底層機制,如果使用不當,不僅可能導致資源讀取失敗,還可能影響程序的可移植性和擴展性。

在 Spring Boot 項目中,resources 目錄承載著大量的關鍵資源,如配置文件、模板文件、腳本資源、數據文件等。而如何以合適的方式高效、安全地讀取這些資源,往往是開發者繞不過的關鍵環節。

不同的資源加載方式有不同的適用場景和底層機制,如果使用不當,不僅可能導致資源讀取失敗,還可能影響程序的可移植性和擴展性。

本文將為你系統性地講解 Spring Boot 中讀取 resources 文件的 9 種主流方式,并在最后附上一套完整的控制器 Demo 示例,集中展示這些方式在實際項目中的統一實現,幫助你在開發中快速定位最適合的資源加載方案。

資源讀取的 9 大方式概覽

我們先逐一列出每種方式的核心思路與適用場景。

1、ClassLoader.getResourceAsStream() —— 通用類加載器讀取方式

說明:以類加載器為起點,查找資源路徑。

InputStream inputStream = getClass().getClassLoader().getResourceAsStream("config/sample.txt");
  • 不依賴 Spring,適用于任意 Java 項目;
  • 路徑從 classpath 根路徑開始,不需要加 /。

2、Class.getResourceAsStream() —— 相對于類路徑加載資源

說明:當前類對象的路徑定位方式,適合讀取與類位于同一包下的資源。

InputStream inputStream = getClass().getResourceAsStream("/config/sample.txt");
  • 以 / 開頭則從根路徑定位;
  • 相對路徑時以類的包路徑為基準。

3、使用 Spring 的 ResourceLoader

說明:借助 Spring 提供的通用資源加載抽象,可讀取 classpath、file、http 等協議資源。

@Resource
private ResourceLoader resourceLoader;

4、使用 ResourceUtils.getFile()

說明:用于將 classpath 路徑資源轉為 File 對象,適合需要文件路徑的場景。

File file = ResourceUtils.getFile("classpath:config/sample.txt");

5、使用 ApplicationContext.getResource()

說明:通過上下文注入加載資源,與 ResourceLoader 類似。

@Resource
private ApplicationContext context;

6、使用 ServletContext.getResourceAsStream()

說明:用于傳統 Servlet 模型,從 Web 路徑中獲取資源文件。

@Resource
private ServletContext servletContext;

7、使用 Java IO 的 File

說明:適用于讀取項目中的真實文件,路徑為實際操作系統路徑。

File file = new File("src/main/resources/config/sample.txt");

8、使用 Java NIO 的 Paths 和 Files

說明:使用 Java 8 的現代化文件操作接口,線程安全且效率更高。

Path path = Paths.get("src/main/resources/config/sample.txt");

9、使用 Spring 的 ClassPathResource

說明:Spring 原生支持 classpath 路徑加載,簡單快捷。

ClassPathResource resource = new ClassPathResource("config/sample.txt");

統一完整代碼實現示例

我們將在一個 Spring Boot 控制器中統一實現這 9 種方式,以 /resource/read/{method} 接口形式暴露,讓你一目了然。

文件路徑準備

請在 src/main/resources/config/sample.txt 文件中放置如下測試內容:

這是一個用于演示讀取 resources 文件的示例文本。

控制器實現:com.icoderoad.resources.controller.ResourceReadController.java

package com.icoderoad.resources.controller;


import jakarta.annotation.Resource;
import jakarta.servlet.ServletContext;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.context.ApplicationContext;
import org.springframework.core.io.ClassPathResource;
import org.springframework.core.io.ResourceLoader;
import org.springframework.stereotype.Controller;
import org.springframework.util.FileCopyUtils;
import org.springframework.util.ResourceUtils;
import org.springframework.web.bind.annotation.*;


import java.io.*;
import java.nio.file.*;
import java.util.HashMap;
import java.util.Map;


@RestController
@RequestMapping("/resource/read")
public class ResourceReadController {


    @Autowired
    private ResourceLoader resourceLoader;


    @Autowired
    private ApplicationContext applicationContext;


    @Autowired
    private ServletContext servletContext;


    private final String filePath = "config/sample.txt";


    @GetMapping("/{method}")
    public Map<String, Object> readFile(@PathVariable String method) {
        Map<String, Object> result = new HashMap<>();
        try {
            String content = switch (method) {
                case "classloader" -> readByClassLoader();
                case "class" -> readByClass();
                case "loader" -> readByResourceLoader();
                case "utils" -> readByResourceUtils();
                case "context" -> readByApplicationContext();
                case "servlet" -> readByServletContext();
                case "file" -> readByFile();
                case "nio" -> readByNio();
                case "classpath" -> readByClassPathResource();
                default -> "Unsupported method!";
            };
            result.put("method", method);
            result.put("content", content);
        } catch (Exception e) {
            result.put("error", e.getMessage());
        }
        return result;
    }


    private String readByClassLoader() throws IOException {
        try (InputStream in = getClass().getClassLoader().getResourceAsStream(filePath)) {
            return streamToString(in);
        }
    }


    private String readByClass() throws IOException {
        try (InputStream in = getClass().getResourceAsStream("/" + filePath)) {
            return streamToString(in);
        }
    }


    private String readByResourceLoader() throws IOException {
        org.springframework.core.io.Resource resource = resourceLoader.getResource("classpath:" + filePath);
        try (InputStream in = resource.getInputStream()) {
            return streamToString(in);
        }
    }


    private String readByResourceUtils() throws IOException {
        File file = ResourceUtils.getFile("classpath:" + filePath);
        try (InputStream in = new FileInputStream(file)) {
            return streamToString(in);
        }
    }


    private String readByApplicationContext() throws IOException {
        org.springframework.core.io.Resource resource = applicationContext.getResource("classpath:" + filePath);
        try (InputStream in = resource.getInputStream()) {
            return streamToString(in);
        }
    }


    private String readByServletContext() throws IOException {
        // 僅適用于傳統部署模式,如 war 包放入 Tomcat 時
        try (InputStream in = servletContext.getResourceAsStream("/WEB-INF/classes/" + filePath)) {
            return streamToString(in);
        }
    }


    private String readByFile() throws IOException {
        File file = new File("src/main/resources/" + filePath);
        try (InputStream in = new FileInputStream(file)) {
            return streamToString(in);
        }
    }


    private String readByNio() throws IOException {
        Path path = Paths.get("src/main/resources/" + filePath);
        try (InputStream in = Files.newInputStream(path)) {
            return streamToString(in);
        }
    }


    private String readByClassPathResource() throws IOException {
        ClassPathResource resource = new ClassPathResource(filePath);
        try (InputStream in = resource.getInputStream()) {
            return streamToString(in);
        }
    }


    private String streamToString(InputStream in) throws IOException {
        return new String(FileCopyUtils.copyToByteArray(in));
    }
}

使用方式說明

請求路徑

對應加載方式

/resource/read/classloader

ClassLoader.getResourceAsStream()

/resource/read/class

Class.getResourceAsStream()

/resource/read/loader

ResourceLoader

/resource/read/utils

ResourceUtils.getFile()

/resource/read/context

ApplicationContext.getResource()

/resource/read/servlet

ServletContext.getResourceAsStream()

/resource/read/file

new File() + FileInputStream

/resource/read/nio

Paths + Files

/resource/read/classpath

ClassPathResource

 總結

在本文中,我們不僅系統講解了 Spring Boot 項目中讀取 resources 目錄下文件的 9 大方式,還構建了一個完整的統一控制器 Demo,集中展示它們在實際項目中的使用方式。你可以根據以下建議進行選擇:

  • 推薦方式(通用性 + 簡潔性):

ClassLoader.getResourceAsStream()

ClassPathResource

ResourceLoader

  • 特定場景方式(依賴文件路徑、Web環境):
  • File / Paths / ServletContext

理解并熟練掌握這些方式,將極大提高你在 Spring Boot 項目中處理靜態資源的靈活性與穩定性,特別是在構建插件機制、配置中心、文件服務等系統中。

責任編輯:武曉燕 來源: 路條編程
相關推薦

2024-09-09 05:30:00

數據庫Spring

2016-06-27 15:40:20

戴爾

2024-10-18 16:21:49

SpringPOM

2009-07-28 10:36:37

ASP.NET讀取Ex

2024-04-03 15:40:14

WebSocketWeb應用Spring

2023-12-21 14:32:51

Python函數

2009-09-15 15:51:52

2025-06-26 04:00:00

Spring數據綁定技術

2025-06-19 08:20:00

開發前端閱讀位置記憶

2009-09-15 16:53:50

2009-10-14 12:56:19

2013-03-31 14:10:55

敏捷開發

2009-07-24 13:01:44

ASP.NET頁面跳轉

2016-11-03 10:03:49

云計算容器超融合

2025-02-05 09:06:35

Spring項目目錄

2025-06-13 07:42:13

2021-09-03 10:08:53

JavaScript開發 代碼

2009-07-02 09:00:11

RHEL5.4 Bet發布

2019-03-15 09:00:27

AWSAzure云計算

2009-07-23 13:47:46

ASP.NET數據緩存
點贊
收藏

51CTO技術棧公眾號

主站蜘蛛池模板: 久久久.com | 男人天堂视频在线观看 | 91香蕉嫩草| 精品国产乱码久久久久久88av | 国产精品中文字幕一区二区三区 | 久久视频精品在线 | 中文字幕国产高清 | 成人欧美一区二区三区在线观看 | 亚洲国产精品一区二区三区 | 国产成人免费视频网站视频社区 | 日韩欧美在线视频 | 黄毛片 | 国产视频二区在线观看 | 国产午夜在线 | 毛片区 | 亚洲精品黄色 | 国产一级视屏 | 老牛嫩草一区二区三区av | 欧美日韩亚 | 精品久久电影 | 国产成人精品免高潮在线观看 | 日批日韩在线观看 | 国产剧情一区 | 欧美天堂 | 国产成人精品免高潮在线观看 | 激情婷婷成人 | 久草视频在线看 | 成人精品毛片 | 天堂一区二区三区四区 | aaaaaaa片毛片免费观看 | 亚洲成人一级 | 99re在线视频观看 | 日日操视频 | 亚洲二区在线观看 | 夜久久| 久久久久成人精品亚洲国产 | 精品一二区| 久久精品91久久久久久再现 | 免费观看av | 老熟女毛片 | 中文字幕 在线观看 |