1. 程式人生 > 其它 >servlet之獲取類路徑下的資原始檔及web檔案在電腦中的位置分佈

servlet之獲取類路徑下的資原始檔及web檔案在電腦中的位置分佈

使用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編譯後的檔案: