आपने कैलम के उत्तर पर अपनी टिप्पणी में कहा कि आप उपयोग करने जा रहे थे
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
।
यह वही है जो जॉन स्कीट ने सुझाव दिया था, सिवाय इसके कि वास्तव में कोई भी अधिभार नहीं है 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
यह है कि अमरूद को उन हिस्सों को संभालने की अनुमति देकर अपने जीवन को आसान बनाना है, जो try-finally
यह सुनिश्चित करने के लिए कि संसाधनों को अच्छी तरह से बंद कर दिया गया है।
संपादित करें: व्यक्तिगत रूप से, मुझे निम्नलिखित मिलते हैं (जो है कि मैं वास्तव में इसे कैसे लिखूंगा, बस ऊपर दिए गए कोड में चरणों को तोड़ रहा था):
String text = CharStreams.toString(
CharStreams.newReaderSupplier(supplier, Charsets.UTF_8));
होने के लिए अब तक इस से वर्बोज़ कम:
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);
}
कौन सा कम या ज्यादा है यह आपको स्वयं ठीक से संभालने के लिए लिखना होगा।
संपादित करें: फ़रवरी २०१४
InputSupplier
और OutputSupplier
उन्हें इस्तेमाल करने वाले तरीकों को अमरूद 16.0 में चित्रित किया गया है। उनकी प्रतिस्थापन कर रहे हैं ByteSource
, CharSource
, ByteSink
और CharSink
। दिया गयाByteSource
, अब आप इसकी सामग्री String
इस प्रकार प्राप्त कर सकते हैं :
ByteSource source = ...
String text = source.asCharSource(Charsets.UTF_8).read();
Charsets.US_ASCII
) आपको कहने की बजाय "एह, जो भी मैं अनुमान लगाता हूं?" जो सभी लोगों को करने में खुशी होती है। खासतौर से चूंकि जावा एक डिफ़ॉल्ट का उपयोग नहीं करता है जो समझ में आता है, जैसे यूटीएफ -8।