কলমের উত্তরের বিষয়ে আপনি আপনার মন্তব্যে বলেছেন যে আপনি ব্যবহার করতে যাচ্ছেন
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
সম্পদগুলি সঠিকভাবে বন্ধ হয়ে গেছে তা নিশ্চিত করার জন্য পেয়ারা সেই অংশগুলিকে পরিচালনা করার অনুমতি দেয় যাতে আপনার কুশল ব্লকের প্রয়োজন হয় handle
সম্পাদনা করুন: ব্যক্তিগতভাবে, আমি নিম্নলিখিতগুলি পেয়েছি (যা আমি এটি আসলে কীভাবে লিখতাম, কেবলমাত্র উপরের কোডের ধাপগুলি ভেঙে দিয়েছিলাম)
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);
}
এটি নিজেকে সঠিকভাবে পরিচালনা করার জন্য আপনাকে কম বেশি কী লিখতে হবে।
সম্পাদনা করুন: ফেব্রুয়ারী 2014
InputSupplier
এবং OutputSupplier
এবং যে পদ্ধতিগুলি সেগুলি ব্যবহার করে তা পেয়ারা ১.0.০ এ অবমুক্ত করা হয়েছে। তাদের প্রতিস্থাপন হয় ByteSource
, CharSource
, ByteSink
এবং CharSink
। একটি দেওয়া ByteSource
, আপনি এখন এর লিখিত সামগ্রী এর মতো পেতে String
পারেন:
ByteSource source = ...
String text = source.asCharSource(Charsets.UTF_8).read();
Charsets.US_ASCII
) আপনি কী বলতে চান তা বোঝার চেয়ে আপনি "উহু, আমার অনুমান যাই হোক না কেন"? যা অনেককেই করতে খুশি মনে হয়। বিশেষত যেহেতু জাভা কোনও ইউটিএফ -8 এর মতো বোধগম্য কোনও ডিফল্ট ব্যবহার করে না।