คุณระบุในความคิดเห็นของคุณเกี่ยวกับคำตอบของ Calum ที่คุณกำลังจะใช้
CharStreams.toString(new InputStreamReader(supplier.get(), Charsets.UTF_8))
รหัสนี้มีปัญหาเนื่องจากCharStreams.toString(Readable)
สถานะโอเวอร์โหลด:
ไม่ปิดไฟล์Readable
.
ซึ่งหมายความว่าของคุณInputStreamReader
และโดยส่วนขยายที่InputStream
ส่งคืนโดยsupplier.get()
จะไม่ถูกปิดหลังจากโค้ดนี้เสร็จสมบูรณ์
ในทางกลับกันหากคุณใช้ประโยชน์จากข้อเท็จจริงที่ว่าคุณมีInputSupplier<InputStream>
และใช้งานเกินพิกัดอยู่แล้วCharStreams.toString(InputSupplier<R extends Readable & Closeable>
) toString
วิธีนี้จะจัดการทั้งการสร้างและการปิดReader
สำหรับคุณ
นี่คือสิ่งที่ Jon Skeet แนะนำยกเว้นว่าไม่มีการโอเวอร์โหลดใด ๆCharStreams.newReaderSupplier
ที่ใช้InputStream
เป็นอินพุต ... คุณต้องให้สิ่งนี้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);
ประเด็นInputSupplier
คือทำให้ชีวิตของคุณง่ายขึ้นโดยให้ Guava จัดการส่วนที่ต้องใช้try-finally
บล็อกที่น่าเกลียดเพื่อให้แน่ใจว่าทรัพยากรถูกปิดอย่างเหมาะสม
แก้ไข: โดยส่วนตัวแล้วฉันพบสิ่งต่อไปนี้ (ซึ่งเป็นวิธีที่ฉันเขียนจริงเพียงแค่แบ่งขั้นตอนในโค้ดด้านบน)
String text = CharStreams.toString(
CharStreams.newReaderSupplier(supplier, Charsets.UTF_8));
ที่จะห่างไกล verbose น้อยกว่านี้:
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);
}
ซึ่งไม่มากก็น้อยสิ่งที่คุณต้องเขียนเพื่อจัดการกับสิ่งนี้อย่างเหมาะสมด้วยตัวคุณเอง
แก้ไข: กุมภาพันธ์ 2014
InputSupplier
และOutputSupplier
และวิธีการที่ใช้พวกเขาได้เลิกใช้แล้วใน Guava 16.0 ทดแทนของพวกเขาByteSource
, CharSource
, และByteSink
CharSink
ระบุByteSource
ตอนนี้คุณสามารถรับเนื้อหาได้String
ดังนี้:
ByteSource source = ...
String text = source.asCharSource(Charsets.UTF_8).read();
Charsets.US_ASCII
) แทนที่จะให้คุณพูดว่า "เอ๊ะมีชุดอักขระใดที่ฉันเดา" ซึ่งสำหรับหลาย ๆ คนดูเหมือนจะมีความสุข โดยเฉพาะอย่างยิ่งเนื่องจาก Java ไม่ใช้ค่าเริ่มต้นที่สมเหตุสมผลเช่น UTF-8