1. 程式人生 > >【轉載】java文件路徑問題及getResource和getClassLoader().getResource的區別

【轉載】java文件路徑問題及getResource和getClassLoader().getResource的區別

場景 article 文件 存在 info com rate () 分享圖片

版權聲明:本文為博主原創文章,未經博主允許不得轉載。 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的區別