亚洲激情专区-91九色丨porny丨老师-久久久久久久女国产乱让韩-国产精品午夜小视频观看

溫馨提示×

溫馨提示×

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

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

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

永安市| 普兰店市| 漯河市| 吴旗县| 云南省| 濮阳县| 黄浦区| 祁连县| 饶平县| 台北县| 靖西县| 和顺县| 邓州市| 师宗县| 左贡县| 蚌埠市| 宁海县| 句容市| 武宣县| 桐柏县| 郑州市| 吉首市| 武定县| 佛冈县| 芦溪县| 本溪市| 阿克| 龙山县| 临颍县| 溧阳市| 磴口县| 碌曲县| 华池县| 莱芜市| 同仁县| 察隅县| 金山区| 南川市| 淳安县| 台山市| 山阳县|