কীভাবে একটি পাঠককে ইনপুট স্ট্রিম এবং রাইটারকে আউটপুট স্ট্রিমে রূপান্তর করবেন?


উত্তর:


46

আপনি পাঠ্য এনকোডিংয়ের সমস্যাগুলি সত্যিই এড়াতে পারবেন না, তবে অ্যাপাচি কমন্সে বিদ্যমান সমাধান রয়েছে:

আপনার নিজের পছন্দসই এনকোডিংটি বেছে নেওয়া দরকার।


7
এফওয়াইআই: রিডার ইনপুট স্ট্রিম কোডটিতে বাইটগুলি পড়ার পদ্ধতিতে একটি বাগ রয়েছে (এটি সমস্ত এনকোডিংয়ের জন্য কাজ করবে না)। প্রুফ: অযৌক্তিকরগমেনটেক্সেপশন.ব্লগস্পট.com / 2009 / 05/… এখানে একটি ওপেন বাগ রয়েছে: Issue.apache.org/bugzilla/show_bug.cgi?id=40455
ম্যাকডোয়েল

4
আপনি অ্যাপাচের কমন্স-আইও লাইব্রেরিতে ক্লাসগুলি পেতে পারেন: commons.apache.org/proper/commons-io
AlikElzin-kilaka

@ এমসিডোয়েল, আপনি যে বাগটি উল্লেখ করেছেন সেটি অ্যাপাচি অ্যান্টের বাস্তবায়নে, কমন্স-আইও-তে নয়, সুতরাং এটি এই উত্তরের সাথে প্রাসঙ্গিক নয়।
রোমান

94

আপনি যদি কোনও স্ট্রিং দিয়ে শুরু করেন তবে নিম্নলিখিতগুলিও করতে পারেন:

new ByteArrayInputStream(inputString.getBytes("UTF-8"))

7
ভাল ReaderInputStreamপ্রয়োগের জন্য কম মেমরির প্রয়োজন হবে - একবারে অ্যারে সমস্ত বাইট সংরক্ষণ করার দরকার নেই।
পাইওটার ফাইন্ডেইন

4
আমি এই সমাধানটির জন্য কাজ করি যখন আপনার টেস্ট কোডটি ইউনিট করা দরকার যা স্ট্যান্ডার্ড ইনপুটটিতে ইনপুট গ্রহণ করে।
কেদার মহাশ্বদে

43

ঠিক আছে, একটি পাঠক অক্ষরগুলি এবং একটি ইনপুট স্ট্রিম বাইটগুলি নিয়ে কাজ করে। এনকোডিংটি উল্লেখ করে যে আপনি কীভাবে আপনার অক্ষরগুলিকে বাইট হিসাবে উপস্থাপন করতে চান, সুতরাং আপনি সত্যিই বিষয়টি উপেক্ষা করতে পারবেন না। সমস্যাগুলি এড়ানোর জন্য, আমার মতামতটি: একটি চরসেট বেছে নিন (উদাঃ "ইউটিএফ -8") এবং এটির সাথে আটকে দিন।

সংক্রান্ত কিভাবে আসলে এটা করতে, যেমন নির্দিষ্ট করা হয়েছে, " এই শ্রেণীর জন্য সুস্পষ্ট নাম ReaderInputStream এবং WriterOutputStream " আশ্চর্যজনক, " এই জাভা লাইব্রেরি অন্তর্ভুক্ত করা হয় না " যদিও 'বিপরীত' ক্লাস, InputStreamReader এবং OutputStreamWriter হয় অন্তর্ভুক্ত

সুতরাং, অ্যাপাচি কমন্স আইও সহ প্রচুর লোকেরা তাদের নিজস্ব বাস্তবায়ন নিয়ে এসেছে । লাইসেন্স সংক্রান্ত সমস্যার উপর নির্ভর করে আপনি সম্ভবত আপনার প্রকল্পে কমন্স-আইও লাইব্রেরি অন্তর্ভুক্ত করতে সক্ষম হবেন, বা উত্স কোডের একটি অংশও অনুলিপি করতে পারবেন (যা এখানে ডাউনলোডযোগ্য ) download

যেমন আপনি দেখতে পাচ্ছেন, উভয় শ্রেণির নথিতে বলা হয়েছে যে "জেআরই দ্বারা সমর্থিত সমস্ত চরসেট এনকোডিংগুলি সঠিকভাবে পরিচালনা করা হয়"।

এনবি এখানে অন্য উত্তরগুলির একটিতে একটি মন্তব্য এই বাগের উল্লেখ করেছে । কিন্তু যে অ্যাপাচি প্রভাবিত অ্যান্ট ReaderInputStream শ্রেণী ( এখানে ), না এ্যাপাচি কমন্স আই ReaderInputStream বর্গ।


19

আরও মনে রাখবেন যে, আপনি যদি স্ট্রিং দিয়ে শুরু করছেন, আপনি স্ট্রিংরেডার তৈরিটি এড়িয়ে যেতে পারেন এবং org.apache.commons.io.IOU কমন্স আইও এর মত একটি পদক্ষেপে ইনপুট স্ট্রিম তৈরি করতে পারেন:

InputStream myInputStream = IOUtils.toInputStream(reportContents, "UTF-8");

অবশ্যই আপনাকে এখনও পাঠ্য এনকোডিং সম্পর্কে ভাবতে হবে তবে কমপক্ষে রূপান্তরটি এক ধাপে ঘটছে।


4
এই পদ্ধতিটি মূলত করে new ByteArrayInputStream(report.toString().getBytes("utf-8")), যার মধ্যে মেমোরিতে প্রতিবেদনের অতিরিক্ত দুটি অনুলিপি বরাদ্দ থাকে। রিপোর্ট বড় হলে তা খারাপ। আমার উত্তর দেখুন।
অলিভ

8

ব্যবহার:

new CharSequenceInputStream(html, StandardCharsets.UTF_8);

এই পথে Stringএবং তারপরে একটি সম্মুখ রূপান্তর প্রয়োজন হয় নাbyte[]রিপোর্টটি বড় হওয়ার ক্ষেত্রে , যা অনেক বেশি গাদা মেমরির বরাদ্দ করে। স্ট্রিংবাফার থেকে সরাসরি স্ট্রিমটি পড়ার সাথে সাথে এটি ফ্লাইতে বাইটে রূপান্তরিত হয়।

এটি অ্যাপাচি কমন্স আইও প্রকল্পের চারসেকেন্স ইনপুট স্ট্রিম ব্যবহার করে ।



5

এই ক্লাসগুলির সুস্পষ্ট নাম হ'ল রিডার ইনপুটস্ট্রিম এবং রাইটারআউটপুট স্ট্রিম। দুর্ভাগ্যক্রমে এগুলি জাভা লাইব্রেরিতে অন্তর্ভুক্ত নয়। তবে গুগল আপনার বন্ধু your

আমি নিশ্চিত নই যে এটি সমস্ত পাঠ্য এনকোডিং সমস্যাগুলি প্রায়শই পেতে চলেছে যা রাত্রিকালীন।

একটি আরএফই আছে, তবে এটি বন্ধ, ঠিক হবে না।


4
bugs.openjdk.java.net/browse/JDK-4103785 একটি মন্তব্য রয়েছে "অক্ষর-সেট কোডিংয়ের জন্য আমাদের একটি সার্বজনীন এপিআই রয়েছে ... এই শ্রেণিগুলি যুক্ত করার কোনও বাধ্যতামূলক কারণ নেই" - সুতরাং অতিরিক্ত ছাড়া কীভাবে কেউ জাভা 7 এ এটি করে? লাইব্রেরি, বারো বছর রাস্তা নিচে?
পাইটর ফাইন্ডেন

5

আপনি পাঠ্য এনকোডিংয়ের সমস্যাগুলি এড়াতে পারবেন না, তবে অ্যাপাচি কমন্স-আইও রয়েছে

নোটগুলি হ'ল কোডার ডটকমের পিটারের উত্তরে উল্লেখ করা লাইব্রেরিগুলি কেবল উত্স কোডের পরিবর্তে লাইব্রেরিতে লিঙ্ক রয়েছে।


4

আপনি যদি একটি বিষয়বস্তু লিখতে চেষ্টা করছেন Readerএকটি থেকে OutputStream? যদি তাই হয়, আপনি একটি সহজ সময় মোড়কে থাকবে OutputStreamএকটি ইন OutputStreamWriterও লিখতে charথেকে গুলি Readerকরার Writerপরিবর্তে একটি পাঠক রূপান্তর করতে চেষ্টা InputStream:

final Writer writer = new BufferedWriter(new OutputStreamWriter( urlConnection.getOutputStream(), "UTF-8" ) );
int charsRead;
char[] cbuf = new char[1024];
while ((charsRead = data.read(cbuf)) != -1) {
    writer.write(cbuf, 0, charsRead);
}
writer.flush();
// don't forget to close the writer in a finally {} block

1

WriterOutputStream ব্যবহার করার সময় একটি সতর্কতা - এটি কোনও ফাইলের কাছে বাইনারি ডেটা সঠিকভাবে / নিয়মিত আউটপুট স্ট্রিমের মতো হ্যান্ডেল করে না। আমার এটি নিয়ে একটি সমস্যা ছিল যা ট্র্যাক ডাউন করতে আমাকে কিছুটা সময় নিয়েছিল।

যদি আপনি পারেন তবে আমি আউটপুট স্ট্রিমটিকে আপনার বেস হিসাবে ব্যবহার করার পরামর্শ দেব এবং যদি আপনার স্ট্রিং লিখতে হয় তবে এটি করতে স্ট্রিমের চারপাশে একটি OUtputStreamWriter মোড়ক ব্যবহার করুন। আশেপাশের অন্যান্য উপাখানের তুলনায় পাঠ্যকে বাইটে রূপান্তর করা অনেক বেশি নির্ভরযোগ্য, এটি সম্ভবত রাইটারআউটপুট স্ট্রিম স্ট্যান্ডার্ড জাভা লাইব্রেরির অংশ নয়



-1

কোন জাভা সরবরাহ করে তা ব্যবহার করে স্ট্রিমের স্ট্রিং পড়ার জন্য।

InputStream s = new BufferedInputStream( new ReaderInputStream( new StringReader("a string")));

6
রিডার ইনপুট স্ট্রিম অ্যাপাচি কমন্স আইওতে রয়েছে।
বিসন
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.