Làm thế nào để chuyển đổi FileInputStream sang InputStream? [đóng cửa]


116

Tôi chỉ muốn chuyển đổi a FileInputStreamthành an InputStream, làm thế nào tôi có thể làm điều đó?

ví dụ

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

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

Nó được chỉ là một câu hỏi ngớ ngẩn .. Tôi đã không có ý tưởng đúng đắn về serialization ... bất cứ 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 tham khảo câu hỏi này vì nó hữu ích.
Whitecat

1
@WilliMentzel Tôi đến đây để tìm kiếm sự chuyển đổi thực tế từ Filelớp sang InputStream. Chỉnh sửa của bạn cho thấy đó là những gì tác giả đang yêu cầu (ít nhất là một phần), và nó không đúng.
Dòng

@Line Tôi chỉ đơn thuần thay đổi định dạng. Tôi không nghĩ rằng tôi đã thay đổi ý nghĩa. Nếu bạn vẫn phản đối, vui lòng khôi phục các thay đổi của tôi. Điều này sẽ được cộng đồng xem xét sau đó. Nhân tiện: làm sao biết tác giả muốn nói gì ngoại trừ câu hỏi bây giờ là gì?
Willi Mentzel

Câu trả lời:


7

Trước tiên, bạn sẽ đọc từ luồng đầu vào và sau đó đóng nó. 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 / trình đọc gói.

Nếu đây là một phương thức trả về InputStream cho người gọi, thì người gọi có trách nhiệm đóng luồng khi kết thúc với nó. Nếu bạn đóng nó trong phương thức của mình, 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 đến một người tiêu dùng từ xa, bạn sẽ ghi nội dung của InputStream vào một OutputStream, rồi đóng cả hai luồng.

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


điều gì sẽ xảy ra nếu tôi muốn gửi một 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 để đóng cửa
Ranjan

2
Bản thân đối tượng luồng không thể tuần tự hóa. Nội dung của dòng có thể được tuần tự - bằng cách viết nội dung vào một OutputStream
sudocode

Trên thực tế, mục tiêu của tôi là gửi một tệp .. Tôi không muốn bất cứ thứ gì chạy sau 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 lo lắng về việc đóng bất cứ thứ gì.
ranjan

1
Tệp cũng không thể tuần tự hóa. Nhưng nội dung của tệp có thể được tuần tự hóa bằng OutputStream.
sudocode

là nó có thể tôi sẽ chờ đợi cho một số lượng thời gian cụ thể và sau đó đóng các inputstream, ví dụ như phụ thuộc vào kích thước của tập tin
Ranjan

136
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;

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


36

FileInputStream một inputStream.

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

Tất nhiên, điều này sẽ không làm những gì bạn muốn nó làm ; luồng bạn quay lại đã bị đóng. Chỉ cần trả lại FileInputStream và hoàn tất với nó. Mã cuộc gọi sẽ đóng nó lại.


hoặc chỉ quay lại fismặc dù tôi không chắc chắn về việc trả lại luồng đã đóng.
Bala R

6
Đây là ngu ngốc - nếu bạn đóng fis- bạn cũng gầnis
Ronk

1
nếu tôi đóng tập tin dữ liệu không được gửi
Ranjan

2
@RonK thực sự. Đó là lý do tại sao tôi đề cập đến nó.
Joeri Hendrickx

3
Chỉ cần một mã ngắn gọn hơn return FileInputStream("c://filename");trong phương pháp có kiểu trả về làInputStream
Yatendra Goel

2

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

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.