2012-06-19 11 views
99

Tôi chỉ muốn chuyển đổi một số File thành một số InputStream, làm cách nào tôi có thể thực hiện điều đó?Tệp vào InputStream

ví dụ

FileInputStream fis = new FileInputStream("c://filename"); 
InputStream is = ?; 
fis.close(); 

Làm thế nào để chuyển đổi FileInputStream để InputStream, vì vậy mà tôi có thể đóng fis hoặc có cách nào khác để chuyển đổi các File-InputStream?

+2

ranjan. Bạn có thể vui lòng thay đổi câu trả lời đúng cho bài đăng này không. Câu trả lời hiện tại là subpar. Nếu bạn thay đổi nó thành cái dưới đây sẽ là tối ưu. – Whitecat

+0

Nó chỉ là một câu hỏi ngớ ngẩn .. Tôi không có ý tưởng đúng về serialization ... bất kỳ ai có thể tham khảo @sudocode – ranjan

+4

nó có thể là một câu hỏi ngớ ngẩn nhưng nhiều người vẫn đề cập đến câu hỏi này bởi vì nó rất hữu ích. – Whitecat

Trả lời

5

Trước tiên bạn thường đọc từ luồng đầu vào và sau đó đóng. Bạn có thể bọc FileInputStream trong một InputStream khác (hoặc Reader). Nó sẽ tự động đóng khi bạn đóng luồng/đầu đọc.

Nếu đây là phương thức trả về InputStream cho người gọi thì trách nhiệm của người gọi là đóng luồng khi kết thúc với nó. Nếu bạn đóng nó trong phương pháp của bạn, người gọi sẽ không thể sử dụng nó.

Để trả lời một số ý kiến ​​của bạn ...

Để gửi nội dung InputStream cho người tiêu dùng từ xa, bạn sẽ viết nội dung của InputStream để một OutputStream, và sau đó đóng cả suối.

Người tiêu dùng ở xa không biết gì về các đối tượng luồng bạn đã tạo. Anh ta chỉ nhận được nội dung, trong một InputStream mà anh ta sẽ tạo ra, đọc từ và đóng.

+0

nếu tôi muốn gửi luồng đầu vào qua thư. .. là nó có thể đóng ở phía bên kia .. hoặc nó không phải là cần thiết để được đóng lại – ranjan

+2

Các đối tượng dòng chính nó không phải là serializable. Nội dung của luồng có thể được tuần tự hóa - bằng cách viết nội dung vào OutputStream – sudocode

+0

Thực ra mục tiêu của tôi là gửi tệp .. Tôi không muốn bất kỳ thứ gì chạy khi tôi gửi .. ví dụ: như thể tôi đang gửi một chuỗi .. để phía bên kia không cần phải lo lắng về việc đóng bất cứ thứ gì. – ranjan

33

FileInputStream một inputStream.

FileInputStream fis = new FileInputStream("c://filename"); 
InputStream is = fis; 
fis.close(); 
return is; 

Tất nhiên, này sẽ không làm những gì bạn muốn nó làm; luồng bạn trả lại đã bị đóng. Chỉ cần trả về FileInputStream và được thực hiện với nó. Mã gọi điện thoại phải đóng.

+0

hoặc chỉ trả về 'fis' mặc dù tôi không chắc chắn về việc trả lại luồng đã đóng. –

+4

Điều này là ngu ngốc - nếu bạn đóng 'fis' - bạn cũng đóng' is' – RonK

+1

nếu tôi đóng dữ liệu tệp không gửi – ranjan

46
InputStream is = new FileInputStream("c://filename"); 
return is; 
2

Nếu bạn quấn một luồng vào luồng khác, bạn không đóng luồng trung gian và rất quan trọng: Bạn không đóng chúng trước khi kết thúc bằng luồng ngoài. Vì bạn cũng sẽ đóng luồng ngoài.

122
InputStream is; 

try { 
    is = new FileInputStream("c://filename"); 

    is.close(); 
} catch (FileNotFoundException e) { 
    // TODO Auto-generated catch block 
    e.printStackTrace(); 
} catch (IOException e) { 
    // TODO Auto-generated catch block 
    e.printStackTrace(); 
} 

return is; 
+8

Tại sao "is.close()" được gọi trước khi "is" được trả về ở cuối. –