Anda menyatakan dalam komentar Anda atas jawaban Calum yang akan Anda gunakan
CharStreams.toString(new InputStreamReader(supplier.get(), Charsets.UTF_8))
Kode ini bermasalah karena kelebihan beban CharStreams.toString(Readable)
menyatakan:
Tidak menutup Readable
.
Ini berarti Anda InputStreamReader
, dan dengan ekstensi yang InputStream
dikembalikan oleh supplier.get()
, tidak akan ditutup setelah kode ini selesai.
Sebaliknya, jika Anda memanfaatkan fakta bahwa Anda tampaknya sudah memiliki InputSupplier<InputStream>
dan menggunakan kelebihan beban CharStreams.toString(InputSupplier<R extends Readable & Closeable>
), toString
metode ini akan menangani pembuatan dan penutupan Reader
untuk Anda.
Ini persis seperti yang disarankan Jon Skeet, kecuali bahwa sebenarnya tidak ada kelebihan beban CharStreams.newReaderSupplier
yang membutuhkan InputStream
masukan ... Anda harus memberikannya 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);
Intinya InputSupplier
adalah untuk membuat hidup Anda lebih mudah dengan mengizinkan Jambu untuk menangani bagian-bagian yang membutuhkan try-finally
blok jelek untuk memastikan bahwa sumber daya ditutup dengan benar.
Sunting: Secara pribadi, saya menemukan yang berikut (begitulah sebenarnya saya menulisnya, baru saja memecah langkah-langkah dalam kode di atas)
String text = CharStreams.toString(
CharStreams.newReaderSupplier(supplier, Charsets.UTF_8));
menjadi jauh lebih verbose dari ini:
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);
}
Kurang lebih apa yang harus Anda tulis untuk menangani ini sendiri dengan benar.
Edit: Februari 2014
InputSupplier
dan OutputSupplier
dan metode yang menggunakannya sudah tidak digunakan lagi di Guava 16.0. Pengganti mereka ByteSource
, CharSource
, ByteSink
dan CharSink
. Diberikan ByteSource
, Anda sekarang bisa mendapatkan isinya String
seperti ini:
ByteSource source = ...
String text = source.asCharSource(Charsets.UTF_8).read();
Charsets.US_ASCII
) daripada membiarkan Anda mengatakan "eh, charset apa yang saya kira?" yang bagi banyak orang tampaknya senang melakukannya. Terutama karena Java tidak menggunakan default yang masuk akal, seperti UTF-8.