आपने कैलम के उत्तर पर अपनी टिप्पणी में कहा कि आप उपयोग करने जा रहे थे
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।