Java如何獲取resources下的文件路徑和創(chuàng)建臨時(shí)文件
獲取resources下的文件路徑和創(chuàng)建臨時(shí)文件
之前處理根據(jù)模板文件,批量導(dǎo)入xxx.zip 的下載功能,用到這兩個(gè)知識(shí),就簡單記錄下,對(duì)于流的處理就跳過了
由于maven項(xiàng)目打包會(huì)把 src/main/java 和 src/main/resources 下的文件放到 target/classes 下,所以統(tǒng)一以根路徑代表此目錄。
創(chuàng)建一個(gè)springboot項(xiàng)目

server:
port: 80
servlet:
context-path: /JQ_Resource獲取resources下的文件路徑
總結(jié)起來有兩點(diǎn):
1、Class.getResource()的獲取資源路徑
- 如果以 / 開頭,則從根路徑開始搜索資源。
- 如果不以 / 開頭,則從當(dāng)前類所在的路徑開始搜索資源。
2、ClassLoader.getResource()的資源獲取不能以 / 開頭,統(tǒng)一從根路徑開始搜索資源。
String path = this.getClass().getClassLoader().getResource("xxx").getPath();測(cè)試:
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)建臨時(shí)文件
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()) {
// 刪除指定文件,不存在報(bào)異常
FileUtils.forceDelete(file);
}
file.createNewFile();
if (dir.isDirectory()) {
// 清除該目錄下的文件及子目錄文件而不刪除該目錄文件夾。該目錄不存在會(huì)報(bào)錯(cuò)
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”)
- 構(gòu)造:File(path)
- 構(gòu)造:FileInputStream(“path”)
XXX.class.getResource("").getPath()
XXX.class.getClassLoader().getResource("").getPath()(以下演示均為Windows系統(tǒng))
相對(duì)路徑:src/test/resources/test.txt
絕對(duì)路徑:D:\glearning\my_opensource\somproject\src\main\resources\test\test.txt
- “.”符號(hào):java文件所在的當(dāng)前目錄(編譯后是.class文件所在的當(dāng)前目錄)
- “…”符號(hào):java文件所在的上一級(jí)目錄(編譯后.class文件的上一級(jí)目錄)
- “/”符號(hào):以/開頭的,在URL類中表示項(xiàng)目的根路徑(maven編譯后就是target目錄的位置)。
System.getProperty(“user.dir”)
表示當(dāng)前用戶目錄,即jvm調(diào)用目錄
File(path)與FileInputStream(path)
java獲取項(xiàng)目路徑中文亂碼
解決方法
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練 習(xí)
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練 習(xí)/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練 習(xí)/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練 習(xí)/bin/
return p;
} catch (Exception e) {
e.printStackTrace();
throw new RuntimeException(e);
}
}
}
通過看代碼和運(yùn)行結(jié)果可以看到,用url.getPath()獲取到的路徑被utf-8編碼了,用URLDecoder.decode(p, “UTF-8”)即可解碼。
總結(jié)
以上為個(gè)人經(jīng)驗(yàn),希望能給大家一個(gè)參考,也希望大家多多支持腳本之家。
相關(guān)文章
在同一個(gè)類中調(diào)用帶有@Transactional注解的方法示例
這篇文章主要為大家介紹了在同一個(gè)類中調(diào)用帶有@Transactional注解的方法示例詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2023-04-04
Java多線程編程之讀寫鎖ReadWriteLock用法實(shí)例
這篇文章主要介紹了Java多線程編程之讀寫鎖ReadWriteLock用法實(shí)例,本文直接給出編碼實(shí)例,需要的朋友可以參考下2015-05-05
基于springmvc之常用注解,操作傳入?yún)?shù)
這篇文章主要介紹了springmvc之常用注解,操作傳入?yún)?shù)方式,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2021-09-09
java算法題解Leetcode763劃分字母區(qū)間示例
這篇文章主要為大家介紹了java算法題解Leetcode763劃分字母區(qū)間示例詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2023-01-01
java 字符串的拼接的實(shí)現(xiàn)實(shí)例
這篇文章主要介紹了java 字符串的拼接的實(shí)現(xiàn)實(shí)例的相關(guān)資料,希望通過本文大家能掌握字符拼接的實(shí)現(xiàn),需要的朋友可以參考下2017-09-09

