2012-07-19 5 views
5

Có vẻ như java đang giữ một số loại bộ nhớ cache cho URL (& tệp). ví dụ: Tôi có một tệp "resourcs.txt" trong tệp jar trong đường dẫn lớp của tôi. Nội dung của tập tin này là: "Phiên bản 1"java.net.URL cache khi đọc từ các tệp

new java.io.BufferedReader (new java.io.InputStreamReader(new URL("jar", "", "file:test.jar!/resourcs.txt").openConnection().getInputStream())).readLine() 

lợi nhuận "Phiên bản 1" (như dự kiến)

tôi thay đổi nội dung tập tin là "phiên bản 2" và gọi một lần nữa để mã này . Và tôi vẫn nhận được "Phiên bản 1"

Làm cách nào để xóa "bộ nhớ cache" này.

Lưu ý: Tôi phát hiện ra điều này chỉ xảy ra trên Linux.

+1

Tôi đặt cược rằng nó là có liên quan đến một thực tế rằng nó là một .jar tệp hơn để sử dụng URL – SJuan76

+0

Tôi không chắc chắn, nó chỉ xảy ra trên Linux –

+1

Thú vị. Các luồng đầu tiên có được đóng đúng không? – esej

Trả lời

6

Do jar giao thức được sử dụng trong URL của bạn, kết nối là một thể hiện của sun.net.www.protocol.jar.JarURLConnection mà mất được hưởng lợi từ một bộ nhớ cache thực hiện trong sun.net.www.protocol.jar.JarFileFactory

Mã nguồn xác nhận việc thực hiện setUseCache(false) khi thực hiện URLConnection sẽ ngăn việc sử dụng bộ nhớ cache đó.

giả thuyết của tôi về sự khác biệt hành vi Linux/Windows: thông báo sự kiện gần từ giao diện URLJarFileCloseController được kích hoạt nhanh hơn trên Windows bởi vì nó không đánh giá cao để giữ tập tin xử lý mở trong một thời gian quá dài ...

1

Tôi nghĩ rằng đây là một số loại vấn đề tải lớp, vì đó là jar-protocoll.

Cố gắng mở bình của bạn dưới dạng tệp zip thay thế.

ZipFile zf = new ZipFile(file); 
try { 
    InputStream in = zf.getInputStream("resourcs.txt"); 
    // ... read from 'in' as normal 
} finally { 
    zf.close(); 
} 
3

Bạn có thể tắt bộ nhớ đệm cho một kết nối url sử dụng,

URLConnection con = new URLConnection(new URL("jar", "", "file:test.jar!/resourcs.txt")); 
    con.setUseCaches(false); 
    new BufferedReader (new InputStreamReader(con.getInputStream())).readLine(); 
3

Trên thực tế, câu trả lời đơn giản thực sự gần với câu trả lời được đưa ra bởi sbridges, nhưng bạn không thể khởi tạo URLConnection bằng cách sử dụng "new URLConnection (...)", bởi vì nó là một lớp trừu tượng.

Bạn chỉ có thể làm theo cách này:

URL url = new URL(urlSrt); 
    URLConnection con = url.openConnection(); 
    con.setUseCaches(false); 
+0

Tuyệt vời, cảm ơn bạn. Tôi nghĩ rằng bộ nhớ đệm tài nguyên trong java là một tính năng nguy hiểm mà không phải ai cũng biết. Tôi đã cố gắng làm mới hình ảnh webcam từ url nhưng luôn có cùng hình ảnh. – Stephan

0

Nếu bạn đang sử dụng một số mã của bên thứ ba này nên làm việc:

url.openConnection().setDefaultUseCaches(false);