Java如何獲取resources下的文件路徑和創(chuàng)建臨時文件
獲取resources下的文件路徑和創(chuàng)建臨時文件
之前處理根據模板文件,批量導入xxx.zip 的下載功能,用到這兩個知識,就簡單記錄下,對于流的處理就跳過了
由于maven項目打包會把 src/main/java 和 src/main/resources 下的文件放到 target/classes 下,所以統一以根路徑代表此目錄。
創(chuàng)建一個springboot項目
server: port: 80 servlet: context-path: /JQ_Resource
獲取resources下的文件路徑
總結起來有兩點:
1、Class.getResource()的獲取資源路徑
- 如果以 / 開頭,則從根路徑開始搜索資源。
- 如果不以 / 開頭,則從當前類所在的路徑開始搜索資源。
2、ClassLoader.getResource()的資源獲取不能以 / 開頭,統一從根路徑開始搜索資源。
String path = this.getClass().getClassLoader().getResource("xxx").getPath();
測試:
public void getResource() { //1、通過Class的getResource方法 String a1 = RescourceController.class.getResource("/cn/jq/jqresource/pojo/User.class").getPath(); String a2 = this.getClass().getResource("../pojo/User.class").getPath(); String a3 = RescourceController.class.getResource("/static/a.txt").getPath(); String a4 = this.getClass().getResource("../../../../static/a.txt").getPath(); System.out.println(a1.equals(a2)); // true System.out.println(a4); // /D:/JQ/workspace/JQ_Resource/target/classes/static/a.txt // 2、通過本類的ClassLoader的getResource方法 String b1 = RescourceController.class.getClassLoader().getResource("cn/jq/jqresource/pojo/User.class").getPath(); String b2 = this.getClass().getClassLoader().getResource("static/a.txt").getPath(); String b3 = this.getClass().getClassLoader().getResource("static/resource/jq.docx").getPath(); // 3、通過ClassLoader的getSystemResource方法 String c1 = ClassLoader.getSystemClassLoader().getResource("cn/jq/jqresource/pojo/User.class").getPath(); String c2 = ClassLoader.getSystemClassLoader().getResource("static/a.txt").getPath(); String c3 = ClassLoader.getSystemClassLoader().getResource("static/resource/jq.docx").getPath(); // 4、通過ClassLoader的getSystemResource方法 String d1 = ClassLoader.getSystemResource("cn/jq/jqresource/pojo/User.class").getPath(); String d2 = ClassLoader.getSystemResource("static/a.txt").getPath(); String d3 = ClassLoader.getSystemResource("static/resource/jq.docx").getPath(); // 5、通過Thread方式的ClassLoader的getResource方法 String e1 = Thread.currentThread().getContextClassLoader().getResource("cn/jq/jqresource/pojo/User.class").getPath(); String e2 = Thread.currentThread().getContextClassLoader().getResource("static/a.txt").getPath(); String e3 = Thread.currentThread().getContextClassLoader().getResource("static/resource/jq.docx").getPath(); }
resources下創(chuàng)建臨時文件
public void createFile(HttpServletRequest request) throws IOException { String contextPath = request.getContextPath(); // /JQ_Resource String filePath = contextPath + "/temp/hr.zip"; String dirPath = contextPath + "/temp/hr"; File file = new File(filePath); File dir = new File(dirPath); if (file.exists()) { // 刪除指定文件,不存在報異常 FileUtils.forceDelete(file); } file.createNewFile(); if (dir.isDirectory()) { // 清除該目錄下的文件及子目錄文件而不刪除該目錄文件夾。該目錄不存在會報錯 FileUtils.cleanDirectory(dir); } else { dir.mkdirs(); } File dir_File = new File(dirPath + "/" + "dir_file.txt"); System.out.println(dir_File.getPath()); // \JQ_Resource\temp\hr\dir_file.txt System.out.println(file.exists()); // true }
Java獲取文件路徑及路徑亂碼問題
System.getProperty(“user.dir”)
- 構造:File(path)
- 構造:FileInputStream(“path”)
XXX.class.getResource("").getPath() XXX.class.getClassLoader().getResource("").getPath()
(以下演示均為Windows系統)
相對路徑:src/test/resources/test.txt
絕對路徑:D:\glearning\my_opensource\somproject\src\main\resources\test\test.txt
- “.”符號:java文件所在的當前目錄(編譯后是.class文件所在的當前目錄)
- “…”符號:java文件所在的上一級目錄(編譯后.class文件的上一級目錄)
- “/”符號:以/開頭的,在URL類中表示項目的根路徑(maven編譯后就是target目錄的位置)。
System.getProperty(“user.dir”)
表示當前用戶目錄,即jvm調用目錄
File(path)與FileInputStream(path)
java獲取項目路徑中文亂碼
解決方法
import java.io.UnsupportedEncodingException; import java.net.URI; import java.net.URL; import java.net.URLDecoder; public class Test01 { public static void main(String[] args) { getPathMethod01(); getPathMethod02(); getPathMethod03(); getPathMethod04(); } private static String getPathMethod01(){ String p = System.getProperty("user.dir"); System.out.println("方法一路徑:"+p); //方法一路徑:E:\test\test04練 習 return p; } private static String getPathMethod02(){ URL url= Test01.class.getResource(""); String p = url.getPath(); System.out.println("方法二路徑:"+p); //方法二路徑:/E:/test/test04%e7%bb%83%20%20%e4%b9%a0/bin/com/fei/ try { System.out.println("方法二解碼路徑:"+URLDecoder.decode(p, "UTF-8")); //方法二解碼路徑:/E:/test/test04練 習/bin/com/fei/ } catch (UnsupportedEncodingException e) { e.printStackTrace(); } return p; } private static String getPathMethod03(){ URL url= Test01.class.getResource("/"); String p = url.getPath(); System.out.println("方法三路徑:"+p); //方法三路徑:/E:/test/test04%e7%bb%83%20%20%e4%b9%a0/bin/ try { System.out.println("方法三解碼路徑:"+URLDecoder.decode(p, "UTF-8")); //方法三解碼路徑:/E:/test/test04練 習/bin/ } catch (UnsupportedEncodingException e) { e.printStackTrace(); } return p; } private static String getPathMethod04(){ try { URI uri = Test01.class.getResource("/").toURI(); String p = uri.getPath(); System.out.println("方法四路徑:"+p); //方法四路徑:/E:/test/test04練 習/bin/ return p; } catch (Exception e) { e.printStackTrace(); throw new RuntimeException(e); } } }
通過看代碼和運行結果可以看到,用url.getPath()獲取到的路徑被utf-8編碼了,用URLDecoder.decode(p, “UTF-8”)即可解碼。
總結
以上為個人經驗,希望能給大家一個參考,也希望大家多多支持腳本之家。
相關文章
解決gateway報netty堆外內存溢出io.netty.util.internal.OutOfDirectMemor
這篇文章主要介紹了解決gateway報netty堆外內存溢出io.netty.util.internal.OutOfDirectMemoryError,具有很好的參考價值,希望對大家有所幫助,如有錯誤或未考慮完全的地方,望不吝賜教2023-12-12Spring?Boot項目集成Knife4j接口文檔的實例代碼
Knife4j就相當于是swagger的升級版,對于我來說,它比swagger要好用得多<BR>,這篇文章主要介紹了Spring?Boot項目集成Knife4j接口文檔的示例代碼,需要的朋友可以參考下2021-12-12使用多個servlet時Spring security需要指明路由匹配策略問題
這篇文章主要介紹了使用多個servlet時Spring security需要指明路由匹配策略問題,具有很好的參考價值,希望對大家有所幫助,如有錯誤或未考慮完全的地方,望不吝賜教2024-08-08