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 InputStreamReadervà theo phần mở rộng được InputStreamtrả 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>), toStringphương thức sẽ xử lý cả việc tạo và đóng Readercho 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.newReaderSuppliernà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 InputSupplierlà 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-finallykhố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
InputSuppliervà OutputSuppliercá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, ByteSinkvà CharSink. Với một ByteSource, bây giờ bạn có thể nhận được nội dung của nó Stringnhư 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.