Các java.io.File
và phối hợp hoạt động trên hệ thống tập tin đĩa cục bộ. Nguyên nhân gốc rễ của vấn đề của bạn là các đường dẫn tương đốijava.io
phụ thuộc vào thư mục làm việc hiện tại. Tức là thư mục mà JVM (trong trường hợp của bạn: máy chủ webs) được khởi động. Điều này có thể là ví dụ C:\Tomcat\bin
hoặc một cái gì đó hoàn toàn khác, nhưng do đó không C:\Tomcat\webapps\contextname
hoặc bất cứ điều gì bạn mong đợi nó sẽ xảy ra. Trong một dự án Eclipse bình thường, điều đó sẽ xảy ra C:\Eclipse\workspace\projectname
. Bạn có thể tìm hiểu về thư mục làm việc hiện tại theo cách sau:
System.out.println(new File(".").getAbsolutePath());
Tuy nhiên, thư mục làm việc không có cách nào kiểm soát được bằng lập trình. Bạn thực sự nên sử dụng các đường dẫn tuyệt đối trong File
API thay vì các đường dẫn tương đối. Ví dụ C:\full\path\to\file.ext
.
Bạn không muốn mã hóa cứng hoặc đoán đường dẫn tuyệt đối trong các ứng dụng Java (web). Đó chỉ là sự cố về tính di động (nghĩa là nó chạy trong hệ thống X, nhưng không chạy trong hệ thống Y). Cách thực hành thông thường là đặt các loại tài nguyên đó trong đường dẫn lớp hoặc thêm đường dẫn đầy đủ của nó vào đường dẫn lớp (trong một IDE như Eclipse là src
thư mục và "đường dẫn xây dựng" tương ứng). Bằng cách này bạn có thể lấy chúng với sự giúp đỡ của ClassLoader
bằng ClassLoader#getResource()
hoặc ClassLoader#getResourceAsStream()
. Nó có thể xác định vị trí các tệp liên quan đến "gốc" của đường dẫn lớp, như bạn đã tìm ra. Trong ứng dụng web (hoặc bất kỳ ứng dụng nào khác sử dụng nhiều trình nạp lớp), chúng tôi khuyên bạn nên sử dụng ClassLoader
như được trả về bởiThread.currentThread().getContextClassLoader()
cho điều này để bạn cũng có thể nhìn "bên ngoài" bối cảnh ứng dụng web.
Một lựa chọn khác trong webapps là ServletContext#getResource()
và đối tác của nó ServletContext#getResourceAsStream()
. Nó có thể truy cập các tập tin nằm ở nơi công cộngweb
thư mục chung của dự án webapp, bao gồm cả /WEB-INF
thư mục. Có ServletContext
sẵn trong các servlet bởi người thừa kếgetServletContext()
phương thức , bạn có thể gọi nó là nguyên trạng.
Xem thêm: