프로젝트 개발 프로세스 중에 프로젝트 resources/static/ 디렉터리의 모든 리소스를 지정된 디렉터리에 복사해야 합니다. 회사 프로젝트에서는 비디오 파일을 다운로드해야 합니다. 다운로드에는 html 페이지가 있으므로 다중 채널 비디오가 로드되고 js, css.jwplayer, jquery.js 및 기타 파일과 같은 해당 정적 리소스 파일이 사용됩니다.
Maven jar의 경로와 일반적으로 출시되는 프로젝트가 다르기 때문에 경로를 읽어보면 jar의 경로를 알 수 있고, jar 안의 파일 경로를 알 수 없습니다.
프로젝트가 jar 패키지로 패키징되므로 기존 디렉터리 파일 복사 방법을 사용할 수 없습니다. 여기서는 Spring 리소스를 사용해야 합니다.
Resource 인터페이스는 단순히 리소스에 대한 추상 액세스 인터페이스입니다. 전체 Spring 프레임워크의 이는 InputStreamSource 인터페이스에서 상속됩니다. 후속 기사에서는 이를 자세히 분석할 것입니다.리소스 인터페이스의 메서드 설명:
설명 | |
---|---|
리소스가 존재하는지 확인합니다. true는 리소스가 존재함을 의미합니다. | |
리소스의 내용을 읽을 수 있는지 확인합니다. 결과가 true이면 내용을 실제로 읽을 수 없지만 false를 반환하면 내용을 읽을 수 없어야 한다는 점에 유의해야 합니다. | |
현재 Resource가 나타내는 기본 리소스가 열렸는지 확인합니다. true가 반환되면 리소스 누출을 방지하기 위해 한 번만 읽은 다음 닫을 수 있습니다. 이는 구현 클래스에서 유일한 것입니다. 반환 결과는 true이고 나머지는 false입니다. | |
현재 리소스에 해당하는 URL을 반환합니다. 현재 리소스를 URL로 확인할 수 없으면 예외가 발생합니다. 예를 들어 ByteArrayResource는 URL로 구문 분석될 수 없습니다. | |
현재 리소스에 해당하는 URI를 반환합니다. 현재 리소스를 URI로 확인할 수 없으면 예외가 발생합니다. | |
현재 리소스에 해당하는 파일을 반환합니다. | |
현재 리소스 콘텐츠의 길이를 반환합니다. | |
현재 리소스가 나타내는 기본 리소스의 마지막 수정 시간을 반환합니다. | |
상대 경로를 기반으로 새 리소스를 만듭니다. [상대 경로 리소스 생성은 기본적으로 지원되지 않습니다.] | |
리소스의 파일 이름을 가져옵니다. | |
현재 리소스의 기본 리소스 설명자를 반환합니다. 이는 일반적으로 리소스의 전체 경로(실제 파일 이름 또는 실제 URL 주소)입니다. | |
현재 리소스가 나타내는 입력 스트림을 가져옵니다. InputStreamResource 구현 클래스를 제외하고 다른 Resource 구현 클래스는 getInputStream() 메소드를 호출할 때마다 완전히 새로운 InputStream을 반환합니다. |
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); }
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 중국어 웹사이트의 기타 관련 기사를 참조하세요!