【轉載】java文件路徑問題及getResource和getClassLoader().getResource的區別
版權聲明:本文為博主原創文章,未經博主允許不得轉載。 https://blog.csdn.net/u012572955/article/details/52880520
我們經常在java的io操作中讀取文件,先看一個場景:
這樣是讀不到這個file文件的,會發生filenotfoundexception
如果我把文件放到了src/main/java下呢,還是會發生filenotfoundexception。
這裏就涉及到一個java編譯時的問題,請看圖:
如果我的:
File f = new File("F:\\bi\\Generate\\src\\main\\java\\1.txt"); 試用未編譯前的絕對路徑,當然是可以讀到文件內容的。
那麽問題來了,我們經常在web項目中引用一個這樣文件,但是上傳的是打包後的經過編譯的源碼,這個絕對路徑就不存在了,那麽打包後的1.txt位於何處呢?在這裏:
我們怎麽才能讀到這個文件呢,下面就引入了java提供的getClassLoader().getResource和getResource的問題,我們先看下面這段代碼:
public class TestFile { @Test public void test1() throws IOException { System.out.println(TestFile.class.getResource("/")); //到classes目錄System.out.println(TestFile.class.getResource("")); //到具體包所在目錄 System.out.println(TestFile.class.getClassLoader().getResource("")); //到classes目錄 System.out.println(TestFile.class.getClassLoader().getResource("/")); // null // File f = new File("F:\\bi\\Generate\\src\\main\\java\\1.txt"); // BufferedReader br = new BufferedReader(new InputStreamReader(new FileInputStream(f)));// String line = ""; // while((line = br.readLine()) != null) { // System.out.println(line); // } } }
結果為:
file:/F:/bi/Generate/target/test-classes/
file:/F:/bi/Generate/target/classes/com/tanlei/test/
file:/F:/bi/Generate/target/test-classes/
null
結論就是:
TestFile.class.getResource("/") 到編譯後的classes目錄,只不過加了前綴 file:
TestFile.class.getResource("")到具體包所在目錄,只不過加了前綴 file:
TestFile.class.getClassLoader().getResource("") 到編譯後的classes目錄,只不過加了前綴 file:
TestFile.class.getClassLoader().getResource("/") 為null,獲取不到
TestFile.class.getResource("/") = TestFile.class.getClassLoader().getResource("")
這裏還有個問題就是:
getResource和getResourceAsStream的區別,
getResourceAsStream是返回所在文件的流,下面這段代碼的解釋顯而易見:
先看圖,1.txt的位置如下
值得註意的是:
在maven中:
src/main/java和src/main/resource的內容在編譯後都位於/target/classes/目錄下;
src/test/java和src/test/resource的內容在編譯後都位於/target/test-classes/目錄下;
我們要獲取位於/target/classes/下的1.txt,代碼可以改變如下:
import org.junit.Test; public class TestFile { @Test public void test1() throws IOException { System.out.println(TestFile.class.getResource("/")); //到classes目錄 System.out.println(TestFile.class.getResource("")); //到具體包所在目錄 System.out.println(TestFile.class.getClassLoader().getResource("")); //到classes目錄 System.out.println(TestFile.class.getClassLoader().getResource("/")); // null // File f = new File("F:\\bi\\Generate\\src\\main\\java\\1.txt"); // BufferedReader br = new BufferedReader(new InputStreamReader(new FileInputStream(f))); BufferedReader br = new BufferedReader(new InputStreamReader(TestFile.class.getResourceAsStream("/1.txt"))); String line = ""; while((line = br.readLine()) != null) { System.out.println(line); } } }
利用getResourceAsStream和前面所講的四種情況的區別,即可獲取文件的流。
是不是已經講的很清楚了!
---------------------
作者:u012572955
來源:CSDN
原文:https://blog.csdn.net/u012572955/article/details/52880520
版權聲明:本文為博主原創文章,轉載請附上博文鏈接!
【轉載】java文件路徑問題及getResource和getClassLoader().getResource的區別