Sử dụng ClassLoader#getResource()
thay vào đó nếu URI của nó đại diện cho đường dẫn hệ thống tệp đĩa cục bộ hợp lệ.
URL resource = classLoader.getResource("resource.ext");
File file = new File(resource.toURI());
FileInputStream input = new FileInputStream(file);
// ...
Nếu không (ví dụ: JAR), thì tốt nhất bạn nên sao chép nó vào tệp tạm thời.
Path temp = Files.createTempFile("resource-", ".ext");
Files.copy(classLoader.getResourceAsStream("resource.ext"), temp, StandardCopyOption.REPLACE_EXISTING);
FileInputStream input = new FileInputStream(temp.toFile());
// ...
Điều đó nói rằng, tôi thực sự không thấy bất kỳ lợi ích của làm như vậy, hoặc nó phải được yêu cầu bởi một lớp helper nghèo/phương pháp đòi hỏi FileInputStream
thay vì InputStream
. Nếu bạn có thể, chỉ cần sửa API để yêu cầu một số InputStream
thay thế. Nếu đó là một bên thứ 3, bằng mọi cách, hãy báo cáo đó là lỗi. Tôi muốn trong trường hợp cụ thể này cũng đặt dấu hỏi xung quanh phần còn lại của API đó.
Tại sao bạn cần nó là FileInputStream? – nos
Bạn có chắc chắn thậm chí có một tệp thực sự sao lưu tài nguyên của bạn chứ không phải một mục nhập trong tệp JAR? –