জাভা: প্রিন্টস্ট্রিম এবং মুদ্রণ লেখকের মধ্যে পার্থক্য


125

মধ্যে পার্থক্য কি PrintStreamএবং PrintWriter? তাদের প্রচুর প্রচলিত পদ্ধতি রয়েছে যার কারণে আমি প্রায়শই এই দুটি ক্লাস মিশ্রিত করি। তদুপরি, আমি মনে করি আমরা তাদের ঠিক একই জিনিসগুলির জন্য ব্যবহার করতে পারি। তবে একটি পার্থক্য থাকতে হবে, অন্যথায়, এখানে কেবল একটি শ্রেণি থাকত।

আমি সংরক্ষণাগারগুলি সন্ধান করেছি, কিন্তু এই প্রশ্নটি খুঁজে পাইনি।


1
+1 ভাল প্রশ্ন, আমি এই দুটি ক্লাসও মিশ্রিত করি এবং এপিআই ডকও খুব একটা সহায়তা করে না।
হেল্পারমোথড

আরেকটি পার্থক্য হ'ল অটোফ্ল্যাশ কীভাবে কাজ করে। লেখকের জন্য আউটপুটে একটি character n চরিত্রের উপস্থিতি ফ্লাশ () ট্রিগার করে। তবে একটি বাইট স্ট্রিমে (মুদ্রণযন্ত্র) কেবল বাইট রয়েছে। অটোফ্লাশ তখন জাভাদোকের বর্ণিত হিসাবে কাজ করে: "প্ল্যাটফর্মের নিজস্ব রেখা বিভাজকের নিজস্ব ধারণা নতুন লাইনের চরিত্রের পরিবর্তে"।
মিনিট

উত্তর:


129

এটি ফ্লিপ্প্যান্ট শোনাতে পারে তবে একটিতে PrintStreamপ্রিন্ট করে OutputStreamএবং PrintWriterএকটিতে প্রিন্ট করে Writer। ঠিক আছে, আমার সন্দেহ আছে যে আমি স্পষ্ট করে বলার জন্য কোনও পয়েন্ট পাব। তবে আরও কিছু আছে।

সুতরাং, একটি OutputStreamএবং একটি মধ্যে পার্থক্য কি Writer? উভয়ই স্রোত, প্রাথমিক পার্থক্যটি হ'ল OutputStreamবাইটের স্রোত এবং একটি Writerঅক্ষরের একটি স্রোত।

যদি কোনও OutputStreamবাইট নিয়ে কাজ করে তবে PrintStream.print(String)কী হবে? এটি ডিফল্ট প্ল্যাটফর্ম এনকোডিং ব্যবহার করে অক্ষরকে বাইটে রূপান্তর করে। ডিফল্ট এনকোডিংটি ব্যবহার করা সাধারণত একটি খারাপ জিনিস কারণ এটি একটি প্ল্যাটফর্ম থেকে অন্য প্ল্যাটফর্মে যাওয়ার সময় বাগের দিকে নিয়ে যেতে পারে, বিশেষত যদি আপনি একটি প্ল্যাটফর্মে ফাইল তৈরি করে থাকেন এবং অন্যটিতে ব্যবহার করছেন।

একটি দিয়ে Writer, আপনি সাধারণত কোনও প্ল্যাটফর্ম নির্ভরতা এড়িয়ে, ব্যবহারের জন্য এনকোডিং নির্দিষ্ট করে।

জেডিকেতে কেন বিরক্ত করবেন PrintStream, যেহেতু প্রাথমিক উদ্দেশ্যটি অক্ষরগুলি লেখার জন্য, এবং বাইটগুলি নয়? PrintStreamজেডিকে ১.১ পূর্বাভাস দেয় যখন পাঠক / লেখক চরিত্রের প্রবাহগুলি চালু হয়েছিল। আমি কল্পনা করি যে যদি সান PrintStreamএত ব্যাপকভাবে ব্যবহৃত হয় তবে সূর্যের অবমূল্যায়ন হত। (সব পরে, তাই না প্রতিটি কলের চায় System.outএকটি অননুমোদিত এপিআই সতর্কবার্তা উৎপন্ন করুন! এছাড়াও, থেকে টাইপ পরিবর্তন PrintStreamকরার জন্য PrintWriterমান আউটপুট স্ট্রিম বিদ্যমান অ্যাপ্লিকেশন বিচ্ছিন্ন হয়ে যেতো উপর।)


3
এটি আমি যা ভেবেছিলাম তাও - তবে এটি সত্য নয়। এমনকি প্রিন্টস্ট্রিম হুডের নিচে কোনও রাইটার বজায় রাখে - আপনি যদি এটি কোনও আউটপুট স্ট্রিম পাস করেন তবে এটি এটিকে আবৃত করে।
জন স্কিটি

3
@ জোন - অভ্যন্তরীণভাবে, সেখানে একজন লেখক রয়েছে, তবে এটি একটি আউটপুট স্ট্রিমকে লেখেন, সুতরাং এর প্রকৃত প্রভাবটি হ'ল একটি মুদ্রণপ্রবাহ একটি আউটপুট স্ট্রিমকে লিখবে - বাইট রূপান্তর ঘটে, এবং ডিফল্ট প্ল্যাটফর্ম এনকোডিং ব্যবহার করে। প্রিন্ট রাইটারে চর-> বাইট রূপান্তরকরণের জন্য এ জাতীয় কোনও প্রয়োজন নেই, আপনি পুরোপুরি অক্ষরের সাথে থাকতে পারেন।
mdma

"ভার্চুয়াল-মেশিন প্রারম্ভকালে ডিফল্ট চরসেটটি নির্ধারিত হয় এবং সাধারণত অন্তর্নিহিত অপারেটিং সিস্টেমের স্থানীয় এবং চারসেটের উপর নির্ভর করে।", এছাড়াও কিছু স্থানীয় প্ল্যাটফর্মের উপর স্থানীয় লোকাল ডিফল্ট অক্ষকে পরিবর্তন করে।
পিন্ডতজুহ

7
জাভা ১.২ থেকে, PrintStreamপ্ল্যাটফর্মের ডিফল্ট এনকোডিং ব্যবহারের মধ্যেই সীমাবদ্ধ ছিল না; এমন কনস্ট্রাক্টর রয়েছে যা একটি চরসেট নাম গ্রহণ করে। সুতরাং PrintStreamএবং PrintWriterএর মধ্যে পার্থক্যগুলি হ'ল একটি PrintWriterকাঁচা বাইট লিখতে পারে না এবং দুটি শ্রেণি বিভিন্ন ধরণের গন্তব্যগুলিকে আবদ্ধ করে।
টেড হপ

1
অথচ তখন তারা থাকবে কার্যকরভাবে একটি ইন্টারফেস ভাগ এটা মূল্য আপনার কাছে তাদের আচরণ মধ্যে একটি উল্লেখযোগ্য পার্থক্য লক্ষ হতে পারে PrintStream'র print()পদ্ধতি সুবিধা ফাংশন যা কল write()যেমন তারা autoflush আরম্ভ যদি সক্রিয় থাকে। PrintWriterঅন্যদিকে কল দেওয়ার পরে অটোফ্লাশ হবে না print()। আমি আজ কিছু প্রাথমিক শিক্ষার জাভা প্রদর্শন করছি এবং এটি এমন কিছু শিক্ষার্থীকে ধরেছিল যা ম্যানুয়ালি ফ্লাশ করার প্রয়োজনের সাথে পরিচিত ছিল না। অন্যথায় আপনার উত্তর দুর্দান্ত।
রোবাদব

61

সঙ্গে PrintStreamআপনি প্ল্যাটফর্ম এর ডিফল্ট এনকোডিং করার আটকে আছেন।

PrintStream stream = new PrintStream(output);

সঙ্গে PrintWriterআপনি কিন্তু একটি পাস করতে পারেন OutputStreamWriterএকটি নির্দিষ্ট এনকোডিং এর সাথে।

PrintWriter writer = new PrintWriter(new OutputStreamWriter(output, "UTF-8"));

সুবিধাটি হ'ল, আপনি অক্ষরে এনকোডিং করা চরিত্রগুলি এমনভাবে নিয়ন্ত্রণ করতে পারেন যেগুলি শেষ পর্যন্ত মোজিবাকে শেষ হবে না ।


12
১.৪ থেকে, প্রিন্টস্ট্রিমের জন্য একটি নতুন নির্মাতা রয়েছে যা এনকোডিং নেয়PrintStream(OutputStream out, boolean autoFlush, String encoding)
আর্টব্রিজটল

19

জেডিকে ১.৪ থেকে যেহেতু মুদ্রণযন্ত্রের জন্য অক্ষর এনকোডিং নির্দিষ্ট করা সম্ভব। সুতরাং, প্রিন্টস্ট্রিম এবং প্রিন্ট রাইটারের মধ্যে পার্থক্যগুলি কেবল অটো ফ্লাশিং আচরণ সম্পর্কে এবং কোনও মুদ্রণযন্ত্র কোনও রাইটারকে মোড়ানো করতে পারে না।


3

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


1
প্রিন্টস্ট্রিম বাদে, কারণ এটি একটি এনকোডিং নেয় তাই এটি স্ট্যান্ডার্ড আউটপুট স্ট্রিমের চেয়ে কিছুটা বেশি পরিচালনা করতে পারে।
সাইমন গ্রোনিওল্ট

আশ্চর্যজনক মনে হচ্ছে যে সিস্টেম.আউট, যার একক লক্ষ্য স্ট্রিংগুলি মুদ্রণ করা এটি আসলে একটি মুদ্রণযন্ত্র।
মিনিট

"লেখকরা আপনার জন্য অক্ষর সেট স্টাফগুলি পরিচালনা করে" - কেবলমাত্র লেখকরা অক্ষরকে বাইটে রূপান্তরিত করে। সব লেখকই করেন না।
আইভর

2

আপনি কোনও স্ট্রিমে কাঁচা বাইট লিখতে পারেন কোনও লেখককে নয়। PrintWriter javadoc তালিকা অন্যান্য পার্থক্য (সবচেয়ে গুরুত্বপূর্ণভাবে, একটি স্ট্রিম উপর একটি এনকোডিং নির্ধারণ করতে তাই এটি কাঁচা বাইট আমি বলতে চাই ব্যাখ্যা করতে সক্ষম হচ্ছে)।


প্রিন্টস্ট্রিমের সাহায্যে কেউ এনকোডিংও নির্দিষ্ট করতে পারে
আইভর

1

কোর জাভা থেকে হোরস্টম্যান লিখেছেন

জাভা প্রবীণরা মুদ্রণযন্ত্র ক্লাসে এবং সিস্টেম.আউটে যা ঘটেছে তা ভাবতে পারে। জাভা ০.০ এ, মুদ্রণযন্ত্র ক্লাসটি সহজেই উপরের বাইটটি ফেলে দিয়ে সমস্ত ইউনিকোড অক্ষরকে ASCII অক্ষরে ছিন্ন করে। (তখন, ইউনিকোডটি তখনও একটি 16-বিট এনকোডিং ছিল)) স্পষ্টতই, এটি একটি পরিষ্কার বা বহনযোগ্য পন্থা ছিল না এবং জাভা ১.১-এ পাঠক এবং লেখকদের পরিচয় দিয়ে এটি স্থির করা হয়েছিল। বিদ্যমান কোডের সাথে সামঞ্জস্যের জন্য, System.in, System.out, এবং System.err এখনও পাঠক এবং লেখক নয়, ইনপুট / আউটপুট স্ট্রিম। তবে এখন প্রিন্টস্ট্রিম শ্রেণি অভ্যন্তরীণভাবে ইউনিকোড অক্ষরগুলিকে ডিফল্ট হোস্ট এনকোডিংয়ে প্রিন্ট রাইটার হিসাবে একইভাবে রূপান্তর করে। প্রিন্টস্ট্রিম প্রকারের অবজেক্টগুলি প্রিন্ট লেখকের মতো ঠিক কাজ করে যখন আপনি মুদ্রণ এবং প্রিন্টলন পদ্ধতি ব্যবহার করেন,


-3

প্রিন্টরাইটার হ'ল প্রিন্টস্ট্রিমের বর্ধন।

IE একটি নির্দিষ্ট উদ্দেশ্যে প্রিন্টস্ট্রিম।

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