ホームページ >Java >&#&チュートリアル >Springbootでjar操作を実装し、リソースファイルを指定したディレクトリにコピーする方法
プロジェクト開発プロセス中に、プロジェクトの resource/static/ ディレクトリ内のすべてのリソースをコピーする必要があります指定されたディレクトリにコピーされます。会社のプロジェクトでは、ビデオ ファイルをダウンロードする必要があります。ダウンロードには HTML ページがあるため、対応する静的リソース ファイル (js、css.jwplayer、jquery.js およびその他のファイルなど) を使用してマルチチャンネル ビデオをロードします
Maven が生成する jar のパスが通常公開されているプロジェクトのパスと異なるため、パスを読み込むと jar のパスが取得され、jar 内のファイルパスが取得できません
私のニーズに基づいて、コピーのアイデアは、最初に resource/static/blog ディレクトリ内のファイル リストを取得し、次にそのファイルを指定された場所にコピーすることです。リストをループします (相対パスが一貫している必要があります)
プロジェクトは jar パッケージに分類されるため、従来のディレクトリ ファイルのコピー方法は使用できません。ここでは Spring リソースが必要です。
リソース インターフェイス。これは、Spring フレームワーク全体のリソースに対する抽象的なアクセス インターフェイスです。これは、InputStreamSource インターフェイスから継承します。以降の記事で詳しく分析します。
リソース インターフェイスのメソッドの説明:
メソッド | Description |
---|---|
リソースが存在するかどうかを判断します。true は存在することを意味します。 | |
リソースのコンテンツが読み取り可能かどうかを判断します。結果が true の場合、その内容は実際には読み取り可能ではない可能性がありますが、false を返した場合、その内容は読み取り可能ではないことに注意してください。 | |
現在のリソースによって表される基になるリソースが開かれているかどうかを確認します。true が返された場合、一度だけ読み取ってから閉じることができます。リソース漏洩を避ける; このメソッドは主にInputStreamResourceを対象としていますが、実装クラスでは戻り値のみがtrueとなり、その他はfalseとなります。 | |
現在のリソースに対応する URL を返します。現在のリソースを URL に解決できない場合は、例外がスローされます。たとえば、ByteArrayResource を URL に解析することはできません。 | |
現在のリソースに対応する URI を返します。現在のリソースを URI に解決できない場合は、例外がスローされます。 | |
現在のリソースに対応するファイルを返します。 | |
現在のリソース コンテンツの長さを返します | |
Resource で表される基礎となるリソースの現在の最終変更時刻を返します。 | |
リソースの相対パスに基づいて新しいリソースを作成します。 [相対パス リソースの作成はデフォルトではサポートされていません] | |
リソースのファイル名を取得します。 | |
現在のリソースの基礎となるリソースの記述子を返します。これは通常、リソースの完全なパス (実際のファイル名または実際の URL アドレス) )。 | |
現在のリソースによって表される入力ストリームを取得します。 InputStreamResource 実装クラスを除き、他の Resource 実装クラスは getInputStream() メソッドを呼び出すたびに新しい InputStream を返します。 |
/** * 只复制下载文件中用到的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); }
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; } }
以上がSpringbootでjar操作を実装し、リソースファイルを指定したディレクトリにコピーする方法の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。