1. OutputStreamক্লাস

আমরা সম্প্রতি ইনপুট স্ট্রীমগুলি অন্বেষণ করেছি৷ আউটপুট স্ট্রীম সম্পর্কে কথা বলার সময় এসেছে।

বাইট আউটপুট সমর্থন করে এমন সমস্ত ক্লাসের জন্য ক্লাস OutputStreamহল প্যারেন্ট ক্লাস। এটি একটি বিমূর্ত শ্রেণী যা নিজে থেকে কিছুই করে না, তবে প্রতিটি অনুষ্ঠানের জন্য এটির বংশধর শ্রেণী রয়েছে।

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

কিন্তু ক্লাসে ফিরে OutputStream। এই শ্রেণীর পদ্ধতি রয়েছে যা এর সমস্ত বংশধরদের অবশ্যই প্রয়োগ করতে হবে। এখানে প্রধান হল:

পদ্ধতি বর্ণনা
void write(int b)
intস্ট্রীমে এক বাইট (একটি নয়) লেখে ।
void write(byte[] buffer)
স্ট্রীমে বাইটের একটি অ্যারে লেখে
void write(byte[] buffer, off, len)
স্ট্রীমে বাইটের একটি অ্যারের অংশ লেখে
void flush()
বাফারে সংরক্ষিত সমস্ত ডেটা স্ট্রীমে লেখে
void close()
প্রবাহ বন্ধ করে দেয়

আপনি যখন উত্তরাধিকারসূত্রে পাওয়া একটি ক্লাসের একটি বস্তু তৈরি করেন InputStream, তখন আপনি সাধারণত একটি উৎস অবজেক্ট নির্দিষ্ট করেন যেখান InputStreamথেকে ডেটা পড়ে। আপনি যখন উত্তরাধিকারসূত্রে প্রাপ্ত একটি ক্লাসের একটি অবজেক্ট তৈরি করেন OutputStream, তখন আপনি সাধারণত টার্গেট অবজেক্ট বা স্ট্রীম নির্দিষ্ট করেন যেখানে ডেটা লেখা হবে।

আসুন সংক্ষেপে ক্লাসের সমস্ত পদ্ধতির মধ্য দিয়ে যাওয়া যাক OutputStream:

write(int b)পদ্ধতি

intএই পদ্ধতিটি আউটপুট স্ট্রীমে একটি বাইট (একটি নয়) লেখে । পাস করা মান একটি বাইটে নিক্ষেপ করা হয় এবং int-এর প্রথম তিনটি বাইট বাতিল করা হয়।

write(byte[] buffer)পদ্ধতি

আউটপুট স্ট্রীমে বাইটের প্রদত্ত অ্যারে লেখে। এটাই.

write(byte[] buffer, int offset, int length)পদ্ধতি

আউটপুট স্ট্রীমে বাইটের পাস করা অ্যারের একটি অংশ লেখে। অফসেট ভেরিয়েবল অ্যারের প্রথম উপাদানের সূচী নির্দেশ করে এবং lengthলিখতে হবে উপসেটের দৈর্ঘ্য।

flush()পদ্ধতি

flush()বর্তমান স্ট্রীমে সম্ভাব্য বাফার করা যেকোন ডেটাকে টার্গেট স্ট্রীমে লিখতে বাধ্য করতে পদ্ধতিটি ব্যবহার করা হয় । একটি শৃঙ্খলে সাজানো বাফারিং এবং/অথবা একাধিক স্ট্রিম অবজেক্ট ব্যবহার করার সময় এটি প্রাসঙ্গিক।

close()পদ্ধতি

লক্ষ্য বস্তুতে কোনো অলিখিত তথ্য লেখে। আপনি যদি একটি ব্লক ব্যবহার করেন তবে পদ্ধতিটি close()কল করার দরকার নেই ।try-with-resources

একটি ফাইল কপি করার উদাহরণ

কোড বিঃদ্রঃ
String src = "c:\\projects\\log.txt";
String dest = "c:\\projects\\copy.txt";

try(FileInputStream input = new FileInputStream(src);
FileOutputStream output = new FileOutputStream(dest))
{
   byte[] buffer = new byte[65536]; // 64Kb
   while (input.available() > 0)
   {
      int real = input.read(buffer);
      output.write(buffer, 0, real);
   }
}



InputStreamএকটি ফাইল থেকে পড়ার জন্য
OutputStreamএকটি ফাইল লিখুন

বাফার যাতে আমরা ডেটা পড়ব
যতক্ষণ স্ট্রীমে ডেটা থাকে ততক্ষণ

বাফারে ডেটা পড়ুন
বাফার থেকে দ্বিতীয় স্ট্রীমে ডেটা লিখুন

2. Writerক্লাস

ক্লাসটি ক্লাসের Writerমতো ঠিক একই OutputStream, তবে আবার একটি পার্থক্য: এটি charবাইটের পরিবর্তে অক্ষর ( ) দিয়ে কাজ করে।

এটি একটি বিমূর্ত ক্লাস: আপনি ক্লাসের বস্তু তৈরি করতে পারবেন না Writer। এর মূল লক্ষ্য হল শত শত বংশধর শ্রেণীর জন্য একটি সাধারণ অভিভাবক শ্রেণী হওয়া এবং তাদের চরিত্রের স্ট্রীমগুলির সাথে কাজ করার জন্য সাধারণ পদ্ধতিগুলি দেওয়া।

ক্লাসের পদ্ধতি Writer(এবং এর সমস্ত বংশধর শ্রেণী):

পদ্ধতি বর্ণনা
void write(int b)
intস্রোতে একটি অক্ষর (একটি নয়) লেখে ।
void write(char[] buffer)
প্রবাহে অক্ষরের একটি অ্যারে লেখে
void write(char[] buffer, off, len)
স্ট্রীমে অক্ষরের একটি অ্যারের অংশ লেখে
void write(String str)
স্রোতে একটি স্ট্রিং লেখে
void write(String str, off, len)
প্রবাহে একটি স্ট্রিংয়ের অংশ লেখে
void flush()
বাফারে সংরক্ষিত সমস্ত ডেটা স্ট্রীমে লেখে
void close()
প্রবাহ বন্ধ করে দেয়

পদ্ধতিগুলি ক্লাসের পদ্ধতিগুলির সাথে খুব মিল OutputStream, তবে তারা বাইটের পরিবর্তে অক্ষরগুলির সাথে কাজ করে।

পদ্ধতির বর্ণনা:

write(int b)পদ্ধতি

এই পদ্ধতিটি আউটপুট স্ট্রীমে একটি একক অক্ষর ( char— একটি নয় ) লেখে। intপাস করা মান একটি তে নিক্ষেপ করা হয় charএবং প্রথম দুটি বাইট বাতিল করা হয়।

write(char[] buffer)পদ্ধতি

আউটপুট স্ট্রীমে অক্ষরের প্রদত্ত অ্যারে লেখে।

write(char[] buffer, int offset, int length)পদ্ধতি

আউটপুট স্ট্রীমে অক্ষরের পাস করা অ্যারের একটি অংশ লেখে। ভেরিয়েবলটি offsetঅ্যারের প্রথম উপাদানের সূচী নির্দেশ করে এবং যে lengthসাবসেটটি লিখতে হবে তার দৈর্ঘ্য।

write(String str)পদ্ধতি

আউটপুট স্ট্রীমে প্রদত্ত স্ট্রিং লেখে।

write(String str, int offset, int length)পদ্ধতি

প্রদত্ত স্ট্রিংয়ের একটি অংশ আউটপুট স্ট্রীমে লেখে: স্ট্রিংটি অক্ষরের একটি অ্যারেতে রূপান্তরিত হয়। ভেরিয়েবলটি offsetঅ্যারের প্রথম উপাদানের সূচী নির্দেশ করে এবং যে lengthসাবসেটটি লিখতে হবে তার দৈর্ঘ্য।

flush()পদ্ধতি

flush()বর্তমান স্ট্রীমে সম্ভাব্য বাফার করা যেকোন ডেটাকে টার্গেট স্ট্রীমে লিখতে বাধ্য করতে পদ্ধতিটি ব্যবহার করা হয় । একটি শৃঙ্খলে সাজানো বাফারিং এবং/অথবা একাধিক স্ট্রিম অবজেক্ট ব্যবহার করার সময় এটি প্রাসঙ্গিক।

close()পদ্ধতি

লক্ষ্য বস্তুতে কোনো অলিখিত তথ্য লেখে। আপনি যদি একটি ব্লক ব্যবহার করেন তবে পদ্ধতিটি close()কল করার দরকার নেই ।try-with-resources

একটি প্রোগ্রামের উদাহরণ যা একটি পাঠ্য ফাইল অনুলিপি করে:

কোড বিঃদ্রঃ
String src = "c:\\projects\\log.txt";
String dest = "c:\\projects\\copy.txt";

try(FileReader reader = new FileReader(src);
FileWriter writer = new FileWriter(dest))
{
   char[] buffer = new char[65536]; // 128Kb
   while (reader.ready())
   {
      int real = reader.read(buffer);
      writer.write(buffer, 0, real);
   }
}



Readerএকটি ফাইল থেকে পড়ার জন্য
Writerএকটি ফাইলে লেখার জন্য

বাফার যেখানে আমরা ডেটা পড়ব
যতক্ষণ স্ট্রীমে ডেটা থাকে ততক্ষণ

একটি বাফারে ডেটা পড়ুন
বাফার থেকে দ্বিতীয় স্ট্রীমে ডেটা লিখুন

StringWriterক্লাস

আরেকটি আকর্ষণীয় শ্রেণী রয়েছে যা Writerক্লাসের উত্তরাধিকারী হয়: এটি বলা হয় StringWriter। এটিতে একটি পরিবর্তনযোগ্য স্ট্রিং রয়েছে - একটি StringBufferবস্তু। এবং প্রতিবার আপনি বস্তুতে কিছু "লিখেন" StringWriter, পাঠ্যটি কেবল তার অভ্যন্তরীণ বাফারে যোগ করা হয়।

উদাহরণ:

কোড বিঃদ্রঃ
StringWriter writer = new StringWriter();
writer.write("Hello");
writer.write(String.valueOf(123));

String result = writer.toString();
একটি টার্গেট ক্যারেক্টার স্ট্রীম ( StringWriter) তৈরি করা হয়
একটি স্ট্রিং একটি স্ট্রিং এর ভিতরে বাফারে লেখা হয় একটি স্ট্রিং একটি বস্তুর বিষয়বস্তুকে একটি স্ট্রিংয়ে রূপান্তরিত করার StringWriter
ভিতরে বাফারে লেখা হয়StringWriter

এই ক্ষেত্রে, StringWriterক্লাসটি মূলত ক্লাসের উপর একটি মোড়ক StringBuffer, তবে StringWriterক্লাসটি স্ট্রিম ক্লাসের একটি বংশধর Writerএবং এটি স্ট্রিম অবজেক্টের চেইনগুলিতে ব্যবহার করা যেতে পারে। এটি অনুশীলনে একটি সুন্দর দরকারী সম্পত্তি।



3. PrintStreamক্লাস

আউটপুট স্ট্রীম ক্লাসগুলিকে মধ্যস্থতাকারী স্ট্রীমগুলির সাথে একটি শৃঙ্খলে রাখা যেতে পারে যা তাদের কাছে পাঠানো টার্গেট স্ট্রীমে ডেটা লেখে। এই স্ট্রিমগুলির মিথস্ক্রিয়াটির সাধারণ দৃষ্টিভঙ্গি এইরকম দেখায়:

প্রিন্টস্ট্রিম ক্লাস

সমস্ত মধ্যবর্তী আউটপুট স্ট্রিমগুলির মধ্যে সবচেয়ে আকর্ষণীয় এবং বহুমুখী হল PrintStream৷ এটিতে দশটি পদ্ধতি এবং 12টির মতো কনস্ট্রাক্টর রয়েছে।

ক্লাস PrintStreamউত্তরাধিকারসূত্রে প্রাপ্ত FilterOutputStreamবর্গ, যা উত্তরাধিকারসূত্রে প্রাপ্ত হয় OutputStream। তার মানে ক্লাসের নিজস্ব পদ্ধতি ছাড়াও প্যারেন্ট ক্লাসের সমস্ত পদ্ধতিPrintStream রয়েছে । এখানে সবচেয়ে আকর্ষণীয় হল:

পদ্ধতি বর্ণনা
void print(obj)
পাস করা বস্তুটিকে একটি স্ট্রিং-এ রূপান্তর করে এবং এটিকে টার্গেট স্ট্রিমে আউটপুট করে।
void println(obj)
পাস করা বস্তুটিকে একটি স্ট্রিং-এ রূপান্তর করে এবং এটিকে টার্গেট স্ট্রিমে আউটপুট করে। শেষে একটি লাইন বিরতি যোগ করে
void println()
টার্গেট স্ট্রিমে একটি লাইন ব্রেক অক্ষর আউটপুট করে
PrintStream format(String format, args...)
বিন্যাস স্ট্রিং এবং পাস করা আর্গুমেন্টের উপর ভিত্তি করে একটি স্ট্রিং গঠন করে এবং আউটপুট করে; String.format()পদ্ধতির অনুরূপ

এবং এই দশটি পদ্ধতি কোথায়, আপনি জিজ্ঞাসা করেন?

ঠিক আছে, এটিতে বিভিন্ন পরামিতি সহ বিভিন্ন পদ্ধতি print()এবং পদ্ধতি রয়েছে। println()তাদের এই টেবিলে সংক্ষিপ্ত করা যেতে পারে।

আমরা এই পদ্ধতিগুলিতে ডুব দেব না, কারণ আপনি ইতিমধ্যে সেগুলি ভালভাবে জানেন। আপনি কি অনুমান করতে পারেন আমি কি পাচ্ছি?

মনে আছে System.out.println()? তবে এটি দুটি লাইনে লেখা যেতে পারে:

কোড কনসোল আউটপুট
PrintStream stream = System.out;
stream.println("Hello!");
Hello!

আমাদের প্রিয় কমান্ড হল ক্লাসের স্ট্যাটিক ভেরিয়েবলের মেথডে কল করা । এবং এই পরিবর্তনশীল এর টাইপ হয় .System.out.println()println()outSystemPrintStream

PrintStreamঅনেক CodeGym লেভেলে, এবং প্রায় প্রতিটি টাস্কে, আপনি না জেনেও ক্লাসের মেথড কল করছেন !

বাস্তবিক ব্যবহার

জাভা নামক এই আকর্ষণীয় ক্লাস আছে ByteArrayOutputStream, যা একটি গতিশীলভাবে ক্রমবর্ধমান বাইট অ্যারে যা উত্তরাধিকারসূত্রে পাওয়া যায় OutputStream

একটি ByteArrayOutputStreamবস্তু এবং PrintStreamবস্তুকে এইভাবে শৃঙ্খলিত করা যেতে পারে:

কোড বর্ণনা
ByteArrayOutputStream baos = new ByteArrayOutputStream();

try(PrintStream stream = new PrintStream(baos))
{
   stream.println("Hello");
   stream.println(123);
}

String result = baos.toString();

System.out.println(result);
মেমরিতে একটি রাইট বাফার তৈরি করুন একটি বস্তুতে

বাফারটি মোড়ানো কনসোলে ডেটা লিখুন অ্যারেটিকে একটি স্ট্রিংয়ে রূপান্তর করুন! কনসোল আউটপুট:PrintStream








Hello!
123