Bạn đã nêu trong bình luận của mình về câu trả lời của Calum rằng bạn sẽ sử dụng
CharStreams.toString(new InputStreamReader(supplier.get(), Charsets.UTF_8))
Mã này có vấn đề vì trạng CharStreams.toString(Readable)
thái quá tải :
Không đóng Readable
.
Điều này có nghĩa là của bạn InputStreamReader
và theo phần mở rộng được InputStream
trả về supplier.get()
, sẽ không bị đóng sau khi mã này hoàn thành.
Mặt khác, nếu bạn lợi dụng thực tế là bạn đã có InputSupplier<InputStream>
và sử dụng quá tải CharStreams.toString(InputSupplier<R extends Readable & Closeable>
), toString
phương thức sẽ xử lý cả việc tạo và đóng Reader
cho bạn.
Đây chính xác là những gì Jon Skeet đề xuất, ngoại trừ việc thực sự không có bất kỳ quá tải CharStreams.newReaderSupplier
nào lấy một InputStream
đầu vào làm đầu vào ... bạn phải cung cấp cho nó một InputSupplier
:
InputSupplier<? extends InputStream> supplier = ...
InputSupplier<InputStreamReader> readerSupplier =
CharStreams.newReaderSupplier(supplier, Charsets.UTF_8);
// InputStream and Reader are both created and closed in this single call
String text = CharStreams.toString(readerSupplier);
Mục đích InputSupplier
là làm cho cuộc sống của bạn dễ dàng hơn bằng cách cho phép Guava xử lý các phần yêu cầu một try-finally
khối xấu xí để đảm bảo rằng các tài nguyên được đóng đúng cách.
Chỉnh sửa: Cá nhân tôi thấy điều sau (đó là cách tôi thực sự viết nó, chỉ là chia nhỏ các bước trong đoạn mã ở trên)
String text = CharStreams.toString(
CharStreams.newReaderSupplier(supplier, Charsets.UTF_8));
là xa ít tiết hơn này:
String text;
InputStreamReader reader = new InputStreamReader(supplier.get(),
Charsets.UTF_8);
boolean threw = true;
try {
text = CharStreams.toString(reader);
threw = false;
}
finally {
Closeables.close(reader, threw);
}
Đó là ít nhiều những gì bạn phải viết để tự xử lý việc này đúng cách.
Chỉnh sửa: Tháng 2 năm 2014
InputSupplier
và OutputSupplier
các phương pháp sử dụng chúng đã không được chấp nhận trong Guava 16.0. Thay thế của họ là ByteSource
, CharSource
, ByteSink
và CharSink
. Với một ByteSource
, bây giờ bạn có thể nhận được nội dung của nó String
như sau:
ByteSource source = ...
String text = source.asCharSource(Charsets.UTF_8).read();
Charsets.US_ASCII
) thay vì cho phép bạn nói "ơ, tôi đoán là bộ ký tự nào?" mà đối với nhiều người dường như hạnh phúc khi làm. Đặc biệt là vì Java không sử dụng một mặc định có ý nghĩa, như UTF-8.