中文字幕av专区_日韩电影在线播放_精品国产精品久久一区免费式_av在线免费观看网站

溫馨提示×

溫馨提示×

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

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

springboot怎么實現jar運行復制resources文件到指定的目錄

發布時間:2023-04-13 15:52:52 來源:億速云 閱讀:168 作者:iii 欄目:開發技術

今天小編給大家分享一下springboot怎么實現jar運行復制resources文件到指定的目錄的相關知識點,內容詳細,邏輯清晰,相信大部分人都還太了解這方面的知識,所以分享這篇文章給大家參考一下,希望大家閱讀完這篇文章后有所收獲,下面我們一起來了解一下吧。

springboot實現jar運行復制resources文件到指定的目錄

1. 需求

在項目開發過程中需要將項目resources/static/目錄下所有資源資源復制到指定目錄。公司項目中需要下載視頻文件,由于下載的有個html頁面,對多路視頻進行畫面加載,用到對應的靜態資源文件,如js,css.jwplayer,jquery.js等文件

maven打成的jar和平時發布的項目路徑不通,所以在讀取路徑的時候獲取的是jar的路徑,無法獲取jar里面的文件路徑

2. 思路

根據我的需求,復制的思路大概是,先獲取到resources/static/blog目錄下文件清單,然后通過清單,循環將文件復制到指定位置(相對路徑需要確保一致)

因為項目會被打成jar包,所以不能用傳統的目錄文件復制方式,這里需要用到Spring Resource:

Resource接口,簡單說是整個Spring框架對資源的抽象訪問接口。它繼承于InputStreamSource接口。后續文章會詳細的分析。

Resource接口的方法說明:

方法說明
exists()判斷資源是否存在,true表示存在。
isReadable()判斷資源的內容是否可讀。需要注意的是當其結果為true的時候,其內容未必真的可讀,但如果返回false,則其內容必定不可讀。
isOpen()判斷當前Resource代表的底層資源是否已經打開,如果返回true,則只能被讀取一次然后關閉以避免資源泄露;該方法主要針對于InputStreamResource,實現類中只有它的返回結果為true,其他都為false。
getURL()返回當前資源對應的URL。如果當前資源不能解析為一個URL則會拋出異常。如ByteArrayResource就不能解析為一個URL。
getURI()返回當前資源對應的URI。如果當前資源不能解析為一個URI則會拋出異常。
getFile()返回當前資源對應的File。
contentLength()返回當前資源內容的長度
lastModified()返回當前Resource代表的底層資源的最后修改時間。
createRelative()根據資源的相對路徑創建新資源。[默認不支持創建相對路徑資源]
getFilename()獲取資源的文件名。
getDescription()返回當前資源底層資源的描述符,通常就是資源的全路徑(實際文件名或實際URL地址)。
getInputStream()獲取當前資源代表的輸入流。除了InputStreamResource實現類以外,其它Resource實現類每次調用getInputStream()方法都將返回一個全新的InputStream。

獲取Resource清單,我需要通過ResourceLoader接口獲取資源,在這里我選擇了

org.springframework.core.io.support.PathMatchingResourcePatternResolver

3. 實現代碼

/**
     * 只復制下載文件中用到的js
     */
    private void copyJwplayer() {
        //判斷指定目錄下文件是否存在
        ApplicationHome applicationHome = new ApplicationHome(getClass());
        String rootpath = applicationHome.getSource().getParentFile().toString();
        String realpath=rootpath+"/vod/jwplayer/";   //目標文件
        String silderrealpath=rootpath+"/vod/jwplayer/silder/";   //目標文件
        String historyrealpath=rootpath+"/vod/jwplayer/history/";   //目標文件
        String jwplayerrealpath=rootpath+"/vod/jwplayer/jwplayer/";   //目標文件
        String layoutrealpath=rootpath+"/vod/jwplayer/res/layout/";   //目標文件
        /**
         * 此處只能復制目錄中的文件,不能多層目錄復制(目錄中的目錄不能復制,如果循環復制目錄中的目錄則會提示cannot be resolved to URL because it does not exist)
         */
        //不使用getFileFromClassPath()則報[static/jwplayerF:/workspace/VRSH265/target/classes/static/jwplayer/flvjs/] cannot be resolved to URL because it does not exist
        //jwplayer
        File fileFromClassPath = FreeMarkerUtil.getFileFromClassPath("/static/jwplayer/");  //復制目錄
        FreeMarkerUtil.BatCopyFileFromJar(fileFromClassPath.toString(),realpath);
        //silder
        File flvjspath = FreeMarkerUtil.getFileFromClassPath("/static/jwplayer/silder/");  //復制目錄
        FreeMarkerUtil.BatCopyFileFromJar(flvjspath.toString(),silderrealpath);
        //history
        File historypath = FreeMarkerUtil.getFileFromClassPath("/static/jwplayer/history/");  //復制目錄
        FreeMarkerUtil.BatCopyFileFromJar(historypath.toString(),historyrealpath);
        //jwplayer
        File jwplayerpath = FreeMarkerUtil.getFileFromClassPath("/static/jwplayer/jwplayer/");  //復制目錄
        FreeMarkerUtil.BatCopyFileFromJar(jwplayerpath.toString(),jwplayerrealpath);
        //layout
        File layoutpath = FreeMarkerUtil.getFileFromClassPath("/static/jwplayer/res/layout/");  //復制目錄
        FreeMarkerUtil.BatCopyFileFromJar(layoutpath.toString(),layoutrealpath);
    }

4. 工具類FreeMarkerUtil

package com.aio.util;

import org.apache.commons.io.FileUtils;
import org.apache.commons.lang3.StringUtils;
import org.springframework.core.io.ClassPathResource;
import org.springframework.core.io.Resource;
import org.springframework.core.io.support.PathMatchingResourcePatternResolver;
import org.springframework.core.io.support.ResourcePatternResolver;

import java.io.*;

/**
 * @author:hahaha
 * @creattime:2021-12-02 10:33
 */

public class FreeMarkerUtil {

   
    /**
     * 復制path目錄下所有文件
     * @param path  文件目錄 不能以/開頭
     * @param newpath 新文件目錄
     */
    public static void BatCopyFileFromJar(String path,String newpath) {
        if (!new File(newpath).exists()){
            new File(newpath).mkdir();
        }
        ResourcePatternResolver resolver = new PathMatchingResourcePatternResolver();
        try {
            //獲取所有匹配的文件
            Resource[] resources = resolver.getResources(path+"/*");
            //打印有多少文件
            for(int i=0;i<resources.length;i++) {
                Resource resource=resources[i];
                try {
                    //以jar運行時,resource.getFile().isFile() 無法獲取文件類型,會報異常,抓取異常后直接生成新的文件即可;以非jar運行時,需要判斷文件類型,避免如果是目錄會復制錯誤,將目錄寫成文件。
                    if(resource.getFile().isFile()) {
                        makeFile(newpath+"/"+resource.getFilename());
                        InputStream stream = resource.getInputStream();
                        write2File(stream, newpath+"/"+resource.getFilename());
                    }
                }catch (Exception e) {
                    makeFile(newpath+"/"+resource.getFilename());
                    InputStream stream = resource.getInputStream();
                    write2File(stream, newpath+"/"+resource.getFilename());
                }
            }
        } catch (Exception e) {
            e.printStackTrace();
        }
    }
    /**
     * 創建文件
     * @param path  全路徑 指向文件
     * @return
     */
    public static boolean makeFile(String path) {
        File file = new File(path);
        if(file.exists()) {
            return false;
        }
        if (path.endsWith(File.separator)) {
            return false;
        }
        if(!file.getParentFile().exists()) {
            if(!file.getParentFile().mkdirs()) {
                return false;
            }
        }
        try {
            if (file.createNewFile()) {
                return true;
            } else {
                return false;
            }
        } catch (IOException e) {
            e.printStackTrace();
            return false;
        }
    }
    /**
     * 輸入流寫入文件
     *
     * @param is
     *            輸入流
     * @param filePath
     *            文件保存目錄路徑
     * @throws IOException
     */
    public static void write2File(InputStream is, String filePath) throws IOException {
        OutputStream os = new FileOutputStream(filePath);
        int len = 8192;
        byte[] buffer = new byte[len];
        while ((len = is.read(buffer, 0, len)) != -1) {
            os.write(buffer, 0, len);
        }
        os.close();
        is.close();
    }
    /**
    *處理異常報錯(springboot讀取classpath里的文件,解決打jar包java.io.FileNotFoundException: class path resource cannot be opened)
    **/
    public static File getFileFromClassPath(String path){
        File targetFile = new File(path);
        if(!targetFile.exists()){
            if(targetFile.getParent()!=null){
                File parent=new File(targetFile.getParent());
                if(!parent.exists()){
                    parent.mkdirs();
                }
            }
            InputStream initialStream=null;
            OutputStream outStream =null;
            try {
                Resource resource=new ClassPathResource(path);
                //注意通過getInputStream,不能用getFile
                initialStream=resource.getInputStream();
                byte[] buffer = new byte[initialStream.available()];
                initialStream.read(buffer);
                outStream = new FileOutputStream(targetFile);
                outStream.write(buffer);
            } catch (IOException e) {
            } finally {
                if (initialStream != null) {
                    try {
                        initialStream.close(); // 關閉流
                    } catch (IOException e) {
                    }
                }
                if (outStream != null) {
                    try {
                        outStream.close(); // 關閉流
                    } catch (IOException e) {
                    }
                }
            }
        }
        return targetFile;
    }
}

5.效果

springboot怎么實現jar運行復制resources文件到指定的目錄

以上就是“springboot怎么實現jar運行復制resources文件到指定的目錄”這篇文章的所有內容,感謝各位的閱讀!相信大家閱讀完這篇文章都有很大的收獲,小編每天都會為大家更新不同的知識,如果還想學習更多的知識,請關注億速云行業資訊頻道。

向AI問一下細節

免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

AI

乐亭县| 海原县| 寿光市| 巍山| 灌南县| 额济纳旗| 石门县| 泌阳县| 普兰店市| 葵青区| 武汉市| 和平区| 罗定市| 孟州市| 蒙自县| 新民市| 板桥市| 金沙县| 巴青县| 新晃| 孟州市| 天峻县| 牡丹江市| 仁怀市| 枝江市| 静乐县| 九龙坡区| 龙泉市| 尼勒克县| 商都县| 富民县| 朝阳市| 建德市| 游戏| 苍溪县| 临夏市| 潍坊市| 南召县| 云梦县| 铁岭市| 个旧市|