2010-02-28 28 views
42

Tôi có dòng này trong chương trình của tôi:Làm thế nào để chuyển đổi InputStream để FileInputStream

InputStream Resource_InputStream=this.getClass().getClassLoader().getResourceAsStream("Resource_Name"); 

Nhưng làm thế nào tôi có thể nhận FileInputStream từ nó [Resource_InputStream]?

+9

Tại sao bạn cần nó là FileInputStream? – nos

+2

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? –

Trả lời

53

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 đó.

+0

thay vì 'FileInputStream input = new FileInputStream (temp.toFile());', tôi đã sử dụng 'FileInputStream input = new FileInputStream (temp.toString());'. vì 'temp.toFile' có thể sẽ để lại một đầu vào trống (FileInputStream). vì lý do có thể bạn có thể kiểm tra Path.toFile java api doc –

11

Dài câu chuyện ngắn: Không sử dụng tham số FileInputStream làm thông số hoặc loại biến. Sử dụng lớp cơ sở trừu tượng, trong trường hợp này là InputStream thay thế.

+17

Tôi không thích câu trả lời này, đôi khi bạn thực sự cần một FileInputStream vì bạn cần các phương thức từ API của nó như getChannel() chẳng hạn, và anh ta không hỏi nó là một ý tưởng tốt hay không sử dụng InputStream, chỉ khi có thể hoặc không tạo luồng đầu vào tệp từ luồng đầu vào. Bạn có thể đã sử dụng nhận xét thay vì thêm câu trả lời mới. – arielsan

+0

Còn về java.util.Properties thì sao? – sloven

0

Bạn cần một cái gì đó như:

URL resource = this.getClass().getResource("/path/to/resource.res"); 
    File is = null; 
    try { 
     is = new File(resource.toURI()); 
    } catch (URISyntaxException e1) { 
     // TODO Auto-generated catch block 
     e1.printStackTrace(); 
    } 
    try { 
     FileInputStream input = new FileInputStream(is); 
    } catch (FileNotFoundException e1) { 
     // TODO Auto-generated catch block 
     e1.printStackTrace(); 
    } 

Nhưng nó sẽ chỉ làm việc trong IDE của bạn, không phải trong JAR Runnable. Tôi có cùng một vấn đề được giải thích here.

Các vấn đề liên quan