2016-08-22 25 views
6

Tôi đang cố truy cập tài nguyên từ tệp jar. Tài nguyên nằm trong cùng một thư mục chứa jar.Truy cập tài nguyên bên ngoài bình từ bình

my-dir: 
tester.jar 
test.jpg 

tôi đã cố gắng điều khác nhau bao gồm những điều sau đây, nhưng mỗi lần các dòng đầu vào là null:

[1]

String path = new File(".").getAbsolutePath(); 
InputStream inputStream = this.getClass().getResourceAsStream(path.replace("\\.", "\\") + "test.jpg"); 

[2]

File f = new File(this.getClass().getProtectionDomain().getCodeSource().getLocation().toURI().getPath()); 
InputStream inputStream = this.getClass().getResourceAsStream(f.getParent() + "test.jpg"); 

Can bạn cho tôi một số gợi ý? Cảm ơn.

+1

'getResourceAsStream' được một nguồn tài nguyên từ jar. https://docs.oracle.com/javase/7/docs/api/java/io/FileInputStream.html – tkausl

+1

"getResourceXXX" sẽ tải tài nguyên từ classpath, những gì bạn cần là mở jpg dưới dạng tệp hoặc thêm -dir đến classpath. – folkol

+1

Bạn đã thử chia nhỏ mã, vì vậy bạn chắc chắn rằng bạn có được đường dẫn chính xác đến tệp ** .jpg **? –

Trả lời

5

Nếu bạn chắc chắn, rằng thư mục hiện tại của ứng dụng của bạn là thư mục của jar, bạn chỉ có thể gọi InputStream f = new FileInputStream("test.jpg");

Các getResource phương pháp này sẽ load những thứ sử dụng classloader, không thông qua hệ thống tập tin. Đây là lý do tại sao cách tiếp cận của bạn (1) thất bại.

Nếu thư mục chứa tập tin ảnh *.jar và bạn là trong classpath, bạn có thể nhận được tài nguyên hình ảnh như thể nó là về mặc định gói:

class.getClass().getResourceAsStream("/test.jpg"); 

Cẩn thận: Những hình ảnh bây giờ được nạp trong bộ nạp lớp và miễn là ứng dụng chạy, hình ảnh không được tải và được phục vụ từ bộ nhớ nếu bạn tải lại.

Nếu đường dẫn chứa tệp jar không được đưa ra trong đường dẫn lớp, cách tiếp cận của bạn để có được đường dẫn jarfile là tốt. Nhưng sau đó chỉ cần truy cập vào các tập tin trực tiếp thông qua URI, bằng cách mở một dòng trên nó:

URL u = this.getClass().getProtectionDomain().getCodeSource().getLocation(); 
// u2 is the url derived from the codesource location 
InputStream s = u2.openStream(); 
0

Sử dụng this tutorial để giúp bạn tạo ra một URL vào một tập tin duy nhất trong một tập tin jar.

Dưới đây là một ví dụ:

String jarPath = "/home/user/myJar.jar"; 
String urlStr = "jar:file://" + jarPath + "!/test.jpg"; 
InputStream is = null; 
try { 
    URL url = new URL(urlStr); 
    is = url.openStream(); 
    Image image = ImageIO.read(is); 
} 
catch(Exception e) { 
    e.printStackTrace(); 
} 
finally { 
    try { 
     is.close(); 
    } catch(Exception IGNORE) {} 
} 
Các vấn đề liên quan