servlet之獲取類路徑下的資原始檔及web檔案在電腦中的位置分佈
阿新 • • 發佈:2022-04-10
使用ClassLoader獲取的檔案位置1(包外):
程式碼:
package demo1;
import java.io.IOException;
import java.io.InputStream;
import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
/**
* 獲取類路徑下的資源
*/
@WebServlet("/AServlet")
public class AServlet extends HttpServlet {
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
// 得到ClassLoader
ClassLoader clazz = this.getClass().getClassLoader();
// 呼叫getResourceAsStream(),得到一個InputStream輸入流
InputStream input = clazz.getResourceAsStream("a.txt");
// 讀取輸入流中的內容並儲存在byte[]陣列中
byte[] data = input.readAllBytes();
// 列印
System.out.println("a.txt : \n" + new String(data,0,data.length));
input.close(); // 關閉流
}
}
列印結果:
使用ClassLoader獲取的 檔案位置2(包內):
程式碼:
package demo1;
import java.io.IOException;
import java.io.InputStream;
import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
/**
* 獲取類路徑下的資源
*/
@WebServlet("/AServlet")
public class AServlet extends HttpServlet {
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
// 得到ClassLoader
ClassLoader clazz = this.getClass().getClassLoader();
// 呼叫getResourceAsStream(),得到一個InputStream輸入流
// InputStream input = clazz.getResourceAsStream("a.txt");
InputStream input = clazz.getResourceAsStream("demo1/b.txt");
// 讀取輸入流中的內容並儲存在byte[]陣列中
byte[] data = input.readAllBytes();
// 列印
// System.out.println("a.txt : \n" + new String(data,0,data.length));
System.out.println("b.txt : \n" + new String(data,0,data.length));
input.close(); // 關閉流
}
}
列印結果:
使用Class獲取的檔案位置(包內):
package demo1;
import java.io.IOException;
import java.io.InputStream;
import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
/**
* 獲取類路徑下的資源
*/
@WebServlet("/AServlet")
public class AServlet extends HttpServlet {
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
// 得到ClassLoader
Class clazz = this.getClass();
InputStream input = clazz.getResourceAsStream("b.txt"); // 相對當前類(AServlet)的所在目錄
// 讀取輸入流中的內容並儲存在byte[]陣列中
byte[] data = input.readAllBytes();
// 列印
System.out.println("b.txt : \n" + new String(data,0,data.length));
input.close(); // 關閉流
}
}
使用Class就相當於從類當前目錄讀取,此時讀取包外的檔案就會報錯,那麼此時想要讀取包外的檔案應該怎麼做?
Class讀取檔案位置2(包外):
程式碼:
package demo1;
import java.io.IOException;
import java.io.InputStream;
import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
/**
* 獲取類路徑下的資源
*/
@WebServlet("/AServlet")
public class AServlet extends HttpServlet {
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
// 呼叫getResourceAsStream(),得到一個InputStream輸入流
InputStream input = clazz.getResourceAsStream("/a.txt"); // 相對當前類(AServlet)的所在目錄
// 讀取輸入流中的內容並儲存在byte[]陣列中
byte[] data = input.readAllBytes();
System.out.println("a.txt : \n" + new String(data,0,data.length));
input.close(); // 關閉流
}
}
列印結果:
所以只需要加上一個" / "就行了,不加 / 是相對當前類所在目錄,加上就相對classes所在路徑。
下面的資料夾:
相當於這個:
因為它們的內容一樣:
可以推斷,classes資料夾是一個存放編譯檔案的資料夾。
因為裡面存放了.class編譯後的檔案: