Không có cách nào để chuyển đổi một tùy InputStream
thành một InputSupplier<InputStream>
, bởi vì một InputSupplier<InputStream>
được coi là một đối tượng mà có thể tạo ra một tươi, mới InputStream
mỗi khi phương pháp getInput()
của nó được gọi. Điều này chỉ có thể khi nguồn byte cơ bản có sẵn để tái sử dụng; do đó, các phương thức của nhà máy mất byte[]
hoặc File
và trả lại InputSupplier<InputStream>
.
Như Dimitris gợi ý, InputSupplier
liên quan đến InputStream
giống như cách Iterable
liên quan đến Iterator
. Lớp ẩn danh bạn mô tả không chính xác vì nó trả về luồng cùng một luồng mỗi khi getInput()
được gọi, vì vậy các lời gọi tiếp theo sẽ trả lại InputStream
đã cạn và đóng.
Đây là một vấn đề khác với lớp ẩn danh của bạn: một phần của động lực cho InputSupplier
là giới hạn mức hiển thị của InputStream
thực tế để có thể tự động đóng. Nếu bạn quấn InputStream
bên ngoài có thể nhìn thấy được trong một số InputSupplier
và sau đó chuyển nó vào phương thức tiện ích, phương pháp tiện ích có thể đóng InputStream
của bạn. Bạn có thể được OK với điều đó nhưng đó không phải là một mô hình sử dụng sạch sẽ mà Guava muốn quảng cáo.
Khi tôi thấy mình muốn làm điều tương tự, tôi nhận ra mình đang làm ngược lại. Thay vì làm điều này:
Files.copy(InputSupplier.of(inputStream), destinationFile);
(không tồn tại), tôi nên thay vì được làm điều này:
ByteStreams.copy(inputStream, Files.newOutputStreamSupplier(destinationFile));
http://stackoverflow.com/a/19553971/9636 phải là câu trả lời đúng bởi vì nó giải thích lý do tại sao bạn không thể làm điều đó. –
Bạn nói đúng, nhưng jbyler đã đề xuất giải pháp nào đó ba năm sau đó;) – elou
Đó là giải pháp mà tôi liên kết đến. –