路徑問題一切要看編譯后的文件路徑
比如,源文件路徑是:
而編譯后的文件路徑為:
也就是說,resources文件夾下的文件在編譯后,都是為根目錄,這種情況下,比如我要讀取resources 文件夾下的 my.txt 文件路徑,
寫法①:
// 編譯后,項目根路徑,寫法1 String url1 = A.class.getClassLoader().getResource("").toString(); // 編譯后,項目根路徑,寫法2 String url2 = A.class.getResource("/").toString(); // 編譯后,文件根路徑 String url3 = A.class.getResource("").toString();
輸出:
file:/D:/IdeaWorkspace/test-null-project/target/classes/ file:/D:/IdeaWorkspace/test-null-project/target/classes/ file:/D:/IdeaWorkspace/test-null-project/target/classes/com/convict/
寫法②:
// 還有一種getResource 后調用 getFile方法,就沒有 [file:],而是以 [/D:xxx] 這樣的格式 String url4 = A.class.getClassLoader().getResource("").getFile(); String url5 = A.class.getResource("/").getFile(); String url6 = A.class.getResource("").getFile(); System.out.println(url4); System.out.println(url5); System.out.println(url6);
輸出:
/D:/IdeaWorkspace/test-null-project/target/classes/ /D:/IdeaWorkspace/test-null-project/target/classes/ /D:/IdeaWorkspace/test-null-project/target/classes/com/convict/
寫法③:
String url7 = A.class.getClassLoader().getResource("").getPath(); String url8 = A.class.getResource("/").getPath(); String url9 = A.class.getResource("").getPath(); System.out.println(url7); System.out.println(url8); System.out.println(url9);
輸出:
/D:/IdeaWorkspace/test-null-project/target/classes/ /D:/IdeaWorkspace/test-null-project/target/classes/ /D:/IdeaWorkspace/test-null-project/target/classes/com/convict/
至此,上面已經有多種獲取文件路徑的方式,既然拿到路徑,就可以讀取File 文件,進而讀取文件了,如這是my.txt 的內容
則讀取文件內容的代碼可以如下:
// 獲取路徑 String filePath = A.class.getClassLoader().getResource("my.txt").getFile(); File my = new File(filePath); InputStreamReader isr = new InputStreamReader(new FileInputStream(my), StandardCharsets.UTF_8); BufferedReader br = new BufferedReader(isr); String lineTxt; while ((lineTxt = br.readLine()) != null) { System.out.println(lineTxt); } br.close();
輸出:
擴展:
寫法②getFile 跟寫法③getPath 是有區別的,getResource 方法后返回的是一個 java.net.URL對象,那手動構造一個java.net.URL
URL url = new URL("https://www.baidu.com/img/baidu_jgylogo3.gif?param=1111¶m2=aaaaa"); System.out.println("getFile ==> " + url.getFile()); System.out.println("getPath ==> " + url.getPath());
輸出:
getFile == > /img/baidu_jgylogo3.gif?param=1111¶m2=aaaaa
getPath ==> /img/baidu_jgylogo3.gif
可以看出,getFile() 方法可以拿到參數值,而getPath() 就是只取文件名,JDK中文文檔相關api如下: