Java I/O (Input/Output) প্যাকেজ java.io ফাইল, ডিরেক্টরি, এবং অন্যান্য I/O ডিভাইসের সাথে ইন্টারঅ্যাকশন করার জন্য জাভাতে ব্যবহৃত লাইব্রেরি। I/O অপারেশন দুই ধরনের স্ট্রিমে বিভক্ত করা হয়: Byte Streams এবং Character Streams।
Stream এর ধারণা
Stream হলো একটি ধারাবাহিক ডেটার প্রবাহ যা Input বা Output এর জন্য ব্যবহৃত হয়। এটি ফাইল, কনসোলে বা নেটওয়ার্কের মাধ্যমে ডেটা পাঠানোর বা গ্রহণ করার একটি উপায়। Stream আসলে একটি ইনফিনিট ডেটা প্রবাহ (শুধু একদিকে) যার মাধ্যমে ডেটা পঠন বা লেখার জন্য স্ট্রিম মেকানিজম ব্যবহার করা হয়।
Java Stream এ দুই ধরনের স্ট্রিম রয়েছে:
- Byte Streams - বাইনারি ডেটা পড়া এবং লেখা।
- Character Streams - টেক্সট (ক্যারেক্টার) ডেটা পড়া এবং লেখা।
এখন, Byte Streams এবং Character Streams এর মধ্যে পার্থক্য এবং ব্যবহারিক অবস্থান দেখি।
Byte Streams
Byte Streams হল সেই স্ট্রিম যা 8-বিট বাইট আকারে ডেটা পড়ে এবং লেখে। এটি বাইনারি ডেটা, যেমন ছবি, ভিডিও, অডিও বা অন্যান্য বাইনারি ফাইল প্রক্রিয়াকরণের জন্য ব্যবহৃত হয়।
Byte Streams এর গুরুত্বপূর্ণ ক্লাসসমূহ:
- InputStream:
FileInputStream,BufferedInputStream,DataInputStreamএর মতো ক্লাসগুলি InputStream থেকে ডেটা পড়ার জন্য ব্যবহৃত হয়।
- OutputStream:
FileOutputStream,BufferedOutputStream,DataOutputStreamএর মতো ক্লাসগুলি OutputStream এ ডেটা লেখার জন্য ব্যবহৃত হয়।
Byte Streams এর উদাহরণ (বাইনারি ডেটা ফাইল পড়া এবং লেখা):
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.IOException;
public class ByteStreamExample {
public static void main(String[] args) {
try (FileInputStream fis = new FileInputStream("input.dat");
FileOutputStream fos = new FileOutputStream("output.dat")) {
int byteData;
while ((byteData = fis.read()) != -1) {
fos.write(byteData); // বাইনারি ডেটা পড়া এবং লেখা
}
System.out.println("File copied successfully using Byte Streams.");
} catch (IOException e) {
e.printStackTrace();
}
}
}
এখানে FileInputStream এবং FileOutputStream ব্যবহার করা হয়েছে, যা বাইনারি ডেটা পড়া এবং লেখার জন্য ব্যবহৃত হয়।
Character Streams
Character Streams হল সেই স্ট্রিম যা 16-বিট ক্যারেক্টার আকারে ডেটা পড়ে এবং লেখে। এটি টেক্সট ডেটা, যেমন টেক্সট ফাইল, ইউটিএফ-৮ ডেটা প্রক্রিয়া করতে ব্যবহৃত হয়।
Character Streams এর গুরুত্বপূর্ণ ক্লাসসমূহ:
- Reader:
FileReader,BufferedReader,InputStreamReaderএর মতো ক্লাসগুলি Reader থেকে টেক্সট ডেটা পড়ার জন্য ব্যবহৃত হয়।
- Writer:
FileWriter,BufferedWriter,PrintWriterএর মতো ক্লাসগুলি Writer এ টেক্সট ডেটা লেখার জন্য ব্যবহৃত হয়।
Character Streams এর উদাহরণ (টেক্সট ডেটা ফাইল পড়া এবং লেখা):
import java.io.FileReader;
import java.io.FileWriter;
import java.io.BufferedReader;
import java.io.BufferedWriter;
import java.io.IOException;
public class CharacterStreamExample {
public static void main(String[] args) {
try (BufferedReader br = new BufferedReader(new FileReader("input.txt"));
BufferedWriter bw = new BufferedWriter(new FileWriter("output.txt"))) {
String line;
while ((line = br.readLine()) != null) {
bw.write(line); // টেক্সট ডেটা পড়া এবং লেখা
bw.newLine(); // নতুন লাইন যোগ করা
}
System.out.println("File copied successfully using Character Streams.");
} catch (IOException e) {
e.printStackTrace();
}
}
}
এখানে BufferedReader এবং BufferedWriter ব্যবহার করা হয়েছে যা টেক্সট ফাইল পড়া এবং লেখা সহজ করে।
Byte Streams এবং Character Streams এর মধ্যে পার্থক্য
| বিষয় | Byte Streams | Character Streams |
|---|---|---|
| ডেটা টাইপ | বাইনারি ডেটা (8-bit)। | ক্যারেক্টার ডেটা (16-bit)। |
| ব্যবহার | ইমেজ, অডিও, ভিডিও, অরথর বাইনারি ডেটা। | টেক্সট ফাইল এবং স্ট্রিং ডেটা। |
| ক্লাস | FileInputStream, FileOutputStream | FileReader, FileWriter, BufferedReader, BufferedWriter |
| ফরম্যাট | বাইনারি ফরম্যাট (যেমন JPEG, MP3)। | টেক্সট ফরম্যাট (যেমন UTF-8)। |
Byte Streams এবং Character Streams এর সুবিধা
Byte Streams:
- বাইনারি ডেটার জন্য উপযুক্ত: ইমেজ, অডিও, ভিডিও, অথবা অন্যান্য বাইনারি ফাইলের জন্য ব্যবহৃত।
- ফাইলের আকার বা ডেটা সাইজের ব্যাপারে ন্যূনতম প্রভাব।
Character Streams:
- টেক্সট ডেটার জন্য উপযুক্ত: টেক্সট ফাইল (যেমন
.txt,.csv,.xml) প্রক্রিয়া করতে ব্যবহৃত। - Unicode সাপোর্ট: 16-বিট ক্যারেক্টার আকারে ডেটা প্রক্রিয়া করার জন্য Unicode সাপোর্ট উপলব্ধ।
- Byte Streams এবং Character Streams দুটোই Java I/O সিস্টেমের গুরুত্বপূর্ণ উপাদান, তবে তাদের ব্যবহার উদ্দেশ্য অনুযায়ী পরিবর্তিত হয়। Byte Streams বাইনারি ডেটা প্রসেসিংয়ে ব্যবহৃত হয়, যেখানে Character Streams টেক্সট ডেটার জন্য ব্যবহৃত।
- Byte Streams এবং Character Streams এর মধ্যে মূল পার্থক্য হল যে, Byte Streams 8-বিট ডেটা (বাইনারি ডেটা) এবং Character Streams 16-বিট ডেটা (ক্যারেক্টার ডেটা) প্রসেস করে।
Byte Streams Java I/O API এর একটি গুরুত্বপূর্ণ অংশ, যা ডেটা byte আকারে পড়তে এবং লেখার জন্য ব্যবহৃত হয়। Byte Streams মূলত বাইনারি ডেটা (যেমন, ইমেজ, অডিও, ভিডিও, বা অন্যান্য ফাইল যা টেক্সট নয়) হ্যান্ডেল করতে ব্যবহৃত হয়। Java.io প্যাকেজের InputStream এবং OutputStream ক্লাসগুলো Byte Streams এর মূল উপাদান।
Byte Streams কি?
Byte Streams হল I/O স্ট্রিমের একটি ধরনের ক্লাস যা ডেটাকে 8-বিট বাইট আকারে প্রক্রিয়া করে। এটি মূলত binary data পরিচালনা করতে ব্যবহৃত হয়, যেমন ইমেজ, অডিও, ভিডিও, জিপ ফাইল বা অন্য যেকোনো ফাইল যা text-based data নয়।
Byte Streams ক্লাস InputStream এবং OutputStream এ বিভক্ত:
InputStream: এটি একটি বাইনারি ডেটা উৎস থেকে পড়ার জন্য ব্যবহৃত হয়।OutputStream: এটি বাইনারি ডেটা একটি গন্তব্যে লেখার জন্য ব্যবহৃত হয়।
Byte Streams এর ক্লাসের উদাহরণ
InputStream এর কিছু গুরুত্বপূর্ণ ক্লাস:
- FileInputStream: ফাইল থেকে বাইনারি ডেটা পড়তে ব্যবহৃত হয়।
- BufferedInputStream: ফাইল থেকে ডেটা পড়তে দ্রুততা বৃদ্ধি করতে ব্যবহৃত হয় (buffering প্রদান করে)।
- ByteArrayInputStream: একটি বাইট অ্যারে থেকে ডেটা পড়ে।
- DataInputStream: বাইনারি ডেটা পড়তে ব্যবহৃত হয়, তবে এটি প্রিমিটিভ ডেটা টাইপ (int, float, boolean) পড়তে সক্ষম।
OutputStream এর কিছু গুরুত্বপূর্ণ ক্লাস:
- FileOutputStream: একটি ফাইলে বাইনারি ডেটা লেখার জন্য ব্যবহৃত হয়।
- BufferedOutputStream: ফাইল বা আউটপুট স্ট্রিমে দ্রুত ডেটা লেখার জন্য ব্যবহৃত হয় (buffering প্রদান করে)।
- ByteArrayOutputStream: একটি বাইট অ্যারেতে বাইনারি ডেটা লেখে।
- DataOutputStream: বাইনারি ডেটা লেখা, যেমন প্রিমিটিভ ডেটা টাইপ (int, float, boolean)।
Byte Streams কখন ব্যবহার করবেন?
Byte Streams ব্যবহারের সেরা সময় হলো যখন আপনি binary data (টেক্সট নয়) প্রক্রিয়া করছেন। কিছু উদাহরণ:
- ফাইলের বাইনারি ডেটা পড়া বা লেখা:
- যদি আপনি একটি অডিও ফাইল, ভিডিও ফাইল, ইমেজ ফাইল, জিপ ফাইল বা অন্য কোনো বাইনারি ফাইল পড়তে বা লিখতে চান, তবে Byte Streams ব্যবহার করুন।
- ফাইল কপি করা:
- যখন আপনি একটি ফাইলের সমস্ত কনটেন্ট কপি করতে চান এবং সেই কন্টেন্ট বাইনারি ডেটা, তখন Byte Streams খুবই উপকারী। উদাহরণস্বরূপ, একটি ইমেজ বা অডিও ফাইল।
- Network I/O:
- নেটওয়ার্কের মাধ্যমে বাইনারি ডেটা স্থানান্তরের জন্য Byte Streams ব্যবহার করা হয়। যেমন, ডেটা প্যাকেট বা ফাইল ট্রান্সফার।
- Working with Binary File Formats:
- Byte Streams সঠিকভাবে বাইনারি ফাইল ফরম্যাটগুলি (যেমন PDF, PNG, MP3) প্রক্রিয়া করতে সহায়ক। টেক্সট-ভিত্তিক ফরম্যাট (যেমন CSV, JSON) না হলে আপনাকে Byte Streams ব্যবহার করতে হবে।
Byte Streams এর ব্যবহার - উদাহরণ
ফাইল থেকে বাইনারি ডেটা পড়া (FileInputStream ব্যবহার করে)
import java.io.FileInputStream;
import java.io.IOException;
public class ByteStreamExample {
public static void main(String[] args) {
try (FileInputStream fis = new FileInputStream("input.dat")) {
int byteData;
while ((byteData = fis.read()) != -1) { // একটি বাইট পড়া
System.out.print((char) byteData); // বাইটকে ক্যারেক্টারে কনভার্ট করে প্রিন্ট
}
} catch (IOException e) {
e.printStackTrace();
}
}
}
ব্যাখ্যা:
- FileInputStream দ্বারা input.dat ফাইলের বাইনারি ডেটা পড়া হচ্ছে।
fis.read()প্রতিটি বাইট পড়ে এবং পরে সেটি ক্যারেক্টারে রূপান্তরিত হয়ে আউটপুটে প্রিন্ট হয়।
ফাইলে বাইনারি ডেটা লেখা (FileOutputStream ব্যবহার করে)
import java.io.FileOutputStream;
import java.io.IOException;
public class ByteStreamWriteExample {
public static void main(String[] args) {
try (FileOutputStream fos = new FileOutputStream("output.dat")) {
String data = "Hello, this is a binary data example!";
fos.write(data.getBytes()); // বাইনারি ডেটা ফাইলে লেখা
System.out.println("Data written to file successfully.");
} catch (IOException e) {
e.printStackTrace();
}
}
}
ব্যাখ্যা:
- FileOutputStream দ্বারা output.dat ফাইলে বাইনারি ডেটা লেখা হচ্ছে।
data.getBytes()ব্যবহার করে String কে byte array-তে রূপান্তরিত করা হচ্ছে এবং তারপর সেই বাইনারি ডেটা ফাইলে লেখা হচ্ছে।
Byte Streams এর সুবিধা
- বাইনারি ডেটা সঠিকভাবে প্রক্রিয়া করতে সক্ষম: Byte Streams বাইনারি ডেটা প্রসেস করার জন্য উপযুক্ত এবং কার্যকরী।
- ফাইলের দ্রুত প্রক্রিয়া: কমপ্লেক্স ফাইল ফরম্যাট এবং লার্জ ফাইল ডেটা পড়তে ও লিখতে দক্ষ।
- ফাইল আকারের সীমা: বড় আকারের ফাইলগুলি Byte Streams ব্যবহার করে দ্রুত পরিচালনা করা যায়।
- নেটওয়ার্ক এবং অন্যান্য বাইনারি ডেটা ট্রান্সফার: নেটওয়ার্কে বাইনারি ডেটা পাঠানোর জন্য Byte Streams ভাল কাজ করে।
Byte Streams এর সীমাবদ্ধতা
- টেক্সট ডেটার জন্য উপযুক্ত নয়: যদি আপনি শুধুমাত্র টেক্সট ডেটা প্রক্রিয়া করছেন, তবে Character Streams ব্যবহার করা উচিত।
- কোডিং বা এনকোডিং প্রয়োজন হতে পারে: Byte Streams ব্যবহার করার সময় আপনাকে ডেটা এনকোড বা ডিকোড করতে হতে পারে, যেটি Character Streams বা Data Streams এর তুলনায় কিছুটা জটিল হতে পারে।
Byte Streams Java I/O-এর একটি গুরুত্বপূর্ণ অংশ এবং binary data প্রক্রিয়া করতে ব্যবহৃত হয়। FileInputStream, FileOutputStream, এবং অন্যান্য ক্লাস ব্যবহার করে আপনি বাইনারি ডেটা দ্রুত এবং কার্যকরীভাবে পড়তে এবং লিখতে পারেন। যদি আপনার কাজ টেক্সট ডেটার সাথে সম্পর্কিত না হয় এবং আপনি বড় বা বাইনারি ফাইলগুলির সাথে কাজ করছেন, তবে Byte Streams-এর ব্যবহার খুবই কার্যকর এবং উপকারী।
Character Streams হল Java I/O (Input/Output) সিস্টেমের একটি গুরুত্বপূর্ণ অংশ যা text data (অর্থাৎ, ক্যারেক্টার ডেটা) পড়তে এবং লিখতে ব্যবহৃত হয়। Java তে Character Streams মূলত 16-bit Unicode characters পরিচালনা করে, যা ASCII স্ট্রিং থেকে বিভিন্ন ভাষার অক্ষরসমূহকে সঠিকভাবে প্রসেস করতে সহায়ক।
Java-তে Character Streams দুটি প্রধান ক্লাসের মাধ্যমে কাজ করে:
- Reader (পাঠক)
- Writer (লেখক)
Character Streams এর বৈশিষ্ট্য:
- Byte Streams (যেমন InputStream এবং OutputStream) এর সাথে তুলনা করলে Character Streams টেক্সট ডেটার জন্য উপযুক্ত, কারণ তারা Unicode সাপোর্ট করে।
- Character Streams ব্লক আকারে ডেটা পড়ে এবং লেখে, যা Byte Streams এর তুলনায় দ্রুত এবং আরও কার্যকরী।
Character Streams এর ক্লাসসমূহ:
- Reader: টেক্সট ডেটা পড়ার জন্য ব্যবহৃত হয়।
- FileReader
- BufferedReader
- CharArrayReader
- Writer: টেক্সট ডেটা লেখার জন্য ব্যবহৃত হয়।
- FileWriter
- BufferedWriter
- PrintWriter
- CharArrayWriter
Character Streams এর মেথডসমূহ:
| মেথড | বর্ণনা |
|---|---|
read() | একটি ক্যারেক্টার পড়ে। |
read(char[] cbuf) | ক্যারেক্টার অ্যারে থেকে ডেটা পড়ে। |
write(int c) | একটি ক্যারেক্টার লেখে। |
write(char[] cbuf) | ক্যারেক্টার অ্যারে থেকে ডেটা লেখে। |
close() | স্ট্রিমটি বন্ধ করে। |
Character Streams এর ব্যবহার:
১. FileReader উদাহরণ
FileReader ক্লাস একটি ফাইল থেকে টেক্সট পড়ার জন্য ব্যবহৃত হয়। এটি Character Streams এর সবচেয়ে মৌলিক এবং সাধারণ ক্লাস।
import java.io.FileReader;
import java.io.IOException;
public class FileReaderExample {
public static void main(String[] args) {
try (FileReader fr = new FileReader("example.txt")) {
int character;
while ((character = fr.read()) != -1) {
System.out.print((char) character); // ফাইল থেকে পড়া প্রতিটি ক্যারেক্টার প্রিন্ট করা
}
} catch (IOException e) {
e.printStackTrace();
}
}
}
ব্যাখ্যা:
FileReaderফাইল থেকে টেক্সট পড়ে এবং প্রতিটি ক্যারেক্টারকে কনসোলে প্রিন্ট করে।read()মেথডটি এক একটি ক্যারেক্টার পড়ে, যতক্ষণ না এটি ফাইলের শেষ না আসে (EOF)।
২. BufferedReader উদাহরণ
BufferedReader ফাইলের প্রতিটি লাইন দ্রুত পড়ার জন্য BufferedReader ব্যবহার করা হয়। এটি readLine() মেথড দ্বারা সম্পূর্ণ লাইন পড়তে সক্ষম।
import java.io.BufferedReader;
import java.io.FileReader;
import java.io.IOException;
public class BufferedReaderExample {
public static void main(String[] args) {
try (BufferedReader br = new BufferedReader(new FileReader("example.txt"))) {
String line;
while ((line = br.readLine()) != null) {
System.out.println(line); // ফাইল থেকে পড়া প্রতিটি লাইন প্রিন্ট করা
}
} catch (IOException e) {
e.printStackTrace();
}
}
}
ব্যাখ্যা:
BufferedReaderপ্রতি লাইনে ফাইলের ডেটা পড়ে, যা বড় ফাইলের জন্য খুব কার্যকর।readLine()মেথডটি পুরো লাইনে পড়ে এবংnullরিটার্ন করে যখন EOF আসে।
৩. FileWriter উদাহরণ
FileWriter ফাইলের মধ্যে টেক্সট লেখার জন্য ব্যবহৃত হয়।
import java.io.FileWriter;
import java.io.IOException;
public class FileWriterExample {
public static void main(String[] args) {
try (FileWriter fw = new FileWriter("output.txt")) {
fw.write("Hello, Java!"); // output.txt ফাইলে লেখার জন্য
System.out.println("Data written to file successfully.");
} catch (IOException e) {
e.printStackTrace();
}
}
}
ব্যাখ্যা:
FileWriterফাইলে একটি স্ট্রিং লেখে।write()মেথডটি ক্যারেক্টার বা স্ট্রিং লেখার জন্য ব্যবহৃত হয়।
৪. BufferedWriter উদাহরণ
BufferedWriter ফাইলের মধ্যে টেক্সট লেখার জন্য ব্যবহৃত হয় এবং এটি ফাইল লেখার গতি বাড়ায়, কারণ এটি ডেটা একটি বাফারে সংরক্ষণ করে রাখে।
import java.io.BufferedWriter;
import java.io.FileWriter;
import java.io.IOException;
public class BufferedWriterExample {
public static void main(String[] args) {
try (BufferedWriter bw = new BufferedWriter(new FileWriter("output.txt"))) {
bw.write("Buffered Writing in Java!");
System.out.println("Data written using BufferedWriter.");
} catch (IOException e) {
e.printStackTrace();
}
}
}
ব্যাখ্যা:
BufferedWriterব্যবহার করে ফাইলে দ্রুত লেখার জন্য BufferedWriter ক্লাস ব্যবহৃত হয়।- এটি
write()মেথডের মাধ্যমে টেক্সট ফাইলে লেখে।
Character Streams এর সুবিধা
- Unicode সাপোর্ট: Character Streams Unicode সাপোর্ট করে, তাই এটি বিশ্বের সকল ভাষার অক্ষর পড়তে এবং লেখতে সক্ষম।
- ফাইল লেখার গতি বৃদ্ধি: BufferedReader এবং BufferedWriter ব্যবহার করলে বড় ফাইলের সাথে কাজ করার গতি বৃদ্ধি পায়।
- দ্রুত এবং কার্যকরী: Character Streams মূলত টেক্সট ডেটার জন্য খুব কার্যকরী, বিশেষত ছোট এবং মাঝারি আকারের টেক্সট ফাইলের জন্য।
- Code Readability: Character Streams কোডের readability উন্নত করে, কারণ আপনি সরাসরি text এর সাথে কাজ করতে পারেন।
Character Streams এর সীমাবদ্ধতা
- প্রাথমিকভাবে টেক্সট ডেটার জন্য: এটি বাইনারি ডেটা যেমন ইমেজ বা ভিডিও ফাইল প্রক্রিয়া করার জন্য উপযুক্ত নয়।
- কিছু ইস্যু টেক্সট এনকোডিং: যদি ফাইলটি সঠিক character encoding-এ লেখা না থাকে, তবে পড়তে সমস্যা হতে পারে।
- কম পারফরম্যান্স বাইনারি ডেটার জন্য: বাইনারি ডেটা পরিচালনা করতে Byte Streams বেশি কার্যকরী।
Java Tuples এবং Character Streams
Java Tuples ব্যবহার করে, আপনি File Reader, BufferedReader, File Writer, BufferedWriter ইত্যাদি সম্পর্কিত বিভিন্ন ডেটা সংরক্ষণ করতে পারেন, যেমন ফাইলের নাম, আকার বা অবস্থা।
উদাহরণ:
import org.apache.commons.lang3.tuple.Pair;
import java.io.BufferedReader;
import java.io.FileReader;
import java.io.IOException;
public class TupleWithCharacterStreams {
public static void main(String[] args) {
Pair<String, Long> fileInfo = getFileInfo("example.txt");
System.out.println("File Name: " + fileInfo.getLeft());
System.out.println("File Size: " + fileInfo.getRight() + " bytes");
try (BufferedReader reader = new BufferedReader(new FileReader(fileInfo.getLeft()))) {
String line;
while ((line = reader.readLine()) != null) {
System.out.println(line);
}
} catch (IOException e) {
e.printStackTrace();
}
}
public static Pair<String, Long> getFileInfo(String fileName) {
File file = new File(fileName);
return Pair.of(file.getName(), file.length());
}
}
ব্যাখ্যা:
- Pair<String, Long> ব্যবহার করে ফাইলের নাম এবং আকার সংরক্ষণ করা হয়েছে এবং BufferedReader ব্যবহার করে ফাইলের কন্টেন্ট পড়া হয়েছে।
- Character Streams Java-তে text data (যেমন, ASCII এবং Unicode) প্রক্রিয়া করার জন্য উপযুক্ত এবং কার্যকরী।
- FileReader, BufferedReader, FileWriter, এবং BufferedWriter ফাইলের সাথে টেক্সট ডেটা পরিচালনা করার জন্য খুবই উপযোগী।
- Java Tuples ব্যবহার করে ফাইলের নাম, আকার, এবং অন্যান্য প্রোপার্টি সংরক্ষণ করা যায়, যা পরবর্তীতে প্রসেস বা বিশ্লেষণ করার জন্য কার্যকরী হতে পারে।
Java-এর java.io প্যাকেজ দুটি প্রধান ধরনের স্ট্রিম সরবরাহ করে: Byte Streams এবং Character Streams। এই দুটি স্ট্রিম I/O অপারেশনগুলিকে পরিচালনা করার জন্য ব্যবহৃত হয়, তবে তাদের মধ্যে কিছু মৌলিক পার্থক্য রয়েছে, যা তাদের ব্যবহার এবং কার্যকারিতা প্রভাবিত করে।
1. Byte Streams (বাইট স্ট্রিম)
Byte Streams ডেটাকে 8-বিট (byte) আকারে পড়ে এবং লেখে। এগুলি সাধারণত binary data (যেমন ইমেজ, অডিও, ভিডিও, বা অন্য বাইনারি ফাইল) পরিচালনা করার জন্য ব্যবহৃত হয়। এই স্ট্রিমগুলো সমস্ত ধরনের I/O ডেটা সমর্থন করে, তবে তারা বিশেষভাবে binary data এর জন্য ডিজাইন করা হয়েছে।
- ক্লাস:
InputStream,OutputStream,FileInputStream,FileOutputStream,BufferedInputStream,BufferedOutputStream, ইত্যাদি। - ডেটা টাইপ: বাইট (byte) - 8-বিট ডেটা।
- ব্যবহার: ফাইল বা নেটওয়ার্কের বাইনারি ডেটা পড়া বা লেখা।
- উদাহরণ: ইমেজ ফাইল, অডিও ফাইল, বা ডাটাবেস ফাইল ইত্যাদি।
Byte Streams উদাহরণ:
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.IOException;
public class ByteStreamExample {
public static void main(String[] args) {
try (FileInputStream fis = new FileInputStream("input.txt");
FileOutputStream fos = new FileOutputStream("output.txt")) {
int byteData;
while ((byteData = fis.read()) != -1) {
fos.write(byteData); // Read byte by byte and write it to output
}
System.out.println("File copied successfully using Byte Streams.");
} catch (IOException e) {
e.printStackTrace();
}
}
}
ব্যাখ্যা:
- FileInputStream এবং FileOutputStream ব্যবহার করে byte-by-byte ডেটা পড়া এবং লেখা হচ্ছে।
2. Character Streams (ক্যারেক্টার স্ট্রিম)
Character Streams ডেটাকে 16-বিট (character) আকারে পড়ে এবং লেখে। এগুলি সাধারণত text data (যেমন টেক্সট ফাইল, স্ট্রিং) পরিচালনা করার জন্য ব্যবহৃত হয়। Character Streams ইন্টারনালি UTF-8 বা UTF-16 এনকোডিং ব্যবহার করে, যা আন্তর্জাতিক ভাষা সমর্থন করে এবং টেক্সট ডেটার জন্য উপযুক্ত।
- ক্লাস:
Reader,Writer,FileReader,FileWriter,BufferedReader,BufferedWriter, ইত্যাদি। - ডেটা টাইপ: ক্যারেক্টার (character) - 16-বিট ডেটা।
- ব্যবহার: টেক্সট ডেটা পড়া বা লেখা।
- উদাহরণ: টেক্সট ফাইল, কনফিগারেশন ফাইল, স্ট্রিং ইত্যাদি।
Character Streams উদাহরণ:
import java.io.FileReader;
import java.io.FileWriter;
import java.io.IOException;
public class CharacterStreamExample {
public static void main(String[] args) {
try (FileReader fr = new FileReader("input.txt");
FileWriter fw = new FileWriter("output.txt")) {
int charData;
while ((charData = fr.read()) != -1) {
fw.write(charData); // Read char by char and write it to output
}
System.out.println("File copied successfully using Character Streams.");
} catch (IOException e) {
e.printStackTrace();
}
}
}
ব্যাখ্যা:
- FileReader এবং FileWriter ব্যবহার করে character-by-character ডেটা পড়া এবং লেখা হচ্ছে।
Byte Streams এবং Character Streams এর মধ্যে পার্থক্য:
| বিষয় | Byte Streams | Character Streams |
|---|---|---|
| ডেটা টাইপ | 8-বিট বাইট (byte) | 16-বিট ক্যারেক্টার (character) |
| ডেটা টাইপ সমর্থন | Binary Data (যেমন ইমেজ, অডিও, ভিডিও ফাইল) | Text Data (যেমন টেক্সট ফাইল, কনফিগারেশন ফাইল) |
| ক্লাস | InputStream, OutputStream, FileInputStream, FileOutputStream | Reader, Writer, FileReader, FileWriter |
| স্ট্রিম অপারেশন | ডেটা byte-by-byte পড়া এবং লেখা হয়। | ডেটা character-by-character পড়া এবং লেখা হয়। |
| ব্যবহার | বাইনারি ফাইল পড়া বা লেখা (যেমন ইমেজ, ভিডিও, অডিও) | টেক্সট ফাইল পড়া বা লেখা |
| অন্যান্য বৈশিষ্ট্য | অধিকাংশ বাইনারি ডেটা, UTF-8 বা UTF-16 এনকোডিং সমর্থন নেই | আন্তর্জাতিক ভাষা সমর্থন করে, UTF-8 বা UTF-16 এনকোডিং ব্যবহৃত |
| অপারেশন গতি | সাধারণত দ্রুত (বাইনারি ডেটার জন্য) | কিছুটা ধীর (যেহেতু এতে এনকোডিং এবং ডিকোডিং প্রক্রিয়া থাকে) |
- Byte Streams সাধারণত binary data (যেমন ইমেজ, অডিও) পড়া বা লেখার জন্য ব্যবহৃত হয় এবং Character Streams টেক্সট ডেটার জন্য ব্যবহার করা হয়।
- Byte Streams 8-বিট ডেটা প্রসেস করে এবং Character Streams 16-বিট ক্যারেক্টার প্রসেস করে, যা বিভিন্ন ভাষার টেক্সট ডেটা সহ্য করার জন্য প্রযোজ্য।
- Byte Streams বেশি কার্যকরী binary data পড়তে এবং লিখতে, এবং Character Streams টেক্সট ডেটা পরিচালনা করতে ভাল।
Java তে সঠিক স্ট্রিমের নির্বাচন করার সময় আপনাকে নিশ্চিত করতে হবে যে আপনি কোন ধরনের ডেটার সাথে কাজ করছেন (বাইনারি না টেক্সট) এবং সেই অনুযায়ী স্ট্রিম ব্যবহার করবেন।
Java I/O (Input/Output) প্যাকেজটি java.io প্যাকেজের অংশ, যা ডেটা স্ট্রীম এর মাধ্যমে ফাইল, নেটওয়ার্ক, মেমোরি বা অন্যান্য ইনপুট এবং আউটপুট অপারেশন পরিচালনা করার জন্য ব্যবহৃত হয়। এই প্যাকেজের দুটি প্রধান ক্লাস হল InputStream এবং OutputStream। এগুলি byte-oriented streams হিসেবে কাজ করে এবং বাইনারি ডেটার পাঠ এবং লেখার জন্য ব্যবহৃত হয়।
InputStream ক্লাসের ভূমিকা
InputStream হল java.io প্যাকেজের একটি অ্যাবস্ট্রাক্ট ক্লাস যা বাইট আকারে ডেটা পড়ার জন্য ব্যবহৃত হয়। এটি বিভিন্ন সাবক্লাসের মাধ্যমে ডেটার উৎস থেকে ডেটা পড়ে। এই ক্লাসটি প্রধানত ফাইল, নেটওয়ার্ক সংযোগ বা অন্য যে কোনও বাইনারি ডেটা সোর্স থেকে ডেটা পড়তে ব্যবহৃত হয়।
InputStream এর প্রধান মেথডসমূহ:
int read(): একটি বাইট পড়ে এবং সেগুলিকে int আকারে রিটার্ন করে। EOF (End of File) এ পৌঁছালে এটি -1 রিটার্ন করে।int read(byte[] b): এটি একাধিক বাইট একটি বাফারে পড়ে এবং int দ্বারা কত বাইট পড়া হয়েছে তা রিটার্ন করে।long skip(long n): এটি স্ট্রিমে ন প্রদানকৃত বাইটগুলো উপেক্ষা করে।int available(): স্ট্রিম থেকে পড়ার জন্য কতটা ডেটা উপলব্ধ আছে তা রিটার্ন করে।void close(): ইনপুট স্ট্রিমটি বন্ধ করে, যাতে মেমরি রিলিজ হয়।
InputStream এর কিছু সাধারণ সাবক্লাস:
- FileInputStream: ফাইল থেকে ডেটা পড়ার জন্য ব্যবহৃত হয়।
- ByteArrayInputStream: একটি বাইট অ্যারে থেকে ডেটা পড়ার জন্য ব্যবহৃত হয়।
- BufferedInputStream: ডেটা পড়ার গতি বাড়ানোর জন্য বাফারিং ব্যবহৃত হয়।
OutputStream ক্লাসের ভূমিকা
OutputStream হল java.io প্যাকেজের একটি অ্যাবস্ট্রাক্ট ক্লাস যা বাইট আকারে ডেটা লেখার জন্য ব্যবহৃত হয়। এটি বিভিন্ন সাবক্লাসের মাধ্যমে ডেটার গন্তব্যে ডেটা লেখে। এই ক্লাসটি প্রধানত ফাইল, নেটওয়ার্ক সংযোগ বা অন্য যে কোনও বাইনারি ডেটা গন্তব্যে লেখার জন্য ব্যবহৃত হয়।
OutputStream এর প্রধান মেথডসমূহ:
void write(int b): একটি বাইট লেখে।void write(byte[] b): একাধিক বাইট একটি বাফারে লেখে।void flush(): স্ট্রিমে জমে থাকা সমস্ত ডেটা গন্তব্যে পাঠায়। এই মেথডটি ব্যবহার করা হয় যাতে নিশ্চিত করা যায় যে স্ট্রিমের সমস্ত ডেটা গন্তব্যে পৌঁছে।void close(): আউটপুট স্ট্রিমটি বন্ধ করে, যাতে রিসোর্সগুলি সঠিকভাবে মুক্ত হয়।
OutputStream এর কিছু সাধারণ সাবক্লাস:
- FileOutputStream: ফাইলে ডেটা লেখার জন্য ব্যবহৃত হয়।
- ByteArrayOutputStream: একটি বাইট অ্যারেতে ডেটা লেখার জন্য ব্যবহৃত হয়।
- BufferedOutputStream: ডেটা লেখার গতি বাড়ানোর জন্য বাফারিং ব্যবহৃত হয়।
InputStream এবং OutputStream এর মধ্যে পার্থক্য
| বিষয় | InputStream | OutputStream |
|---|---|---|
| কাজ | ফাইল বা স্ট্রীম থেকে ডেটা পড়া। | ফাইল বা স্ট্রীমে ডেটা লেখা। |
| ডেটা প্রকার | Byte (8-বিট) ডেটা পড়া। | Byte (8-বিট) ডেটা লেখা। |
| মেথড ব্যবহার | read(), available(), skip(), close() | write(), flush(), close() |
| সাবক্লাস | FileInputStream, ByteArrayInputStream, BufferedInputStream | FileOutputStream, ByteArrayOutputStream, BufferedOutputStream |
| মূল উদ্দেশ্য | ইনপুট সোর্স থেকে ডেটা পড়ে আনা। | আউটপুট সোর্সে ডেটা লেখা। |
InputStream এবং OutputStream এর উদাহরণ
ফাইল থেকে ডেটা পড়া (InputStream):
import java.io.FileInputStream;
import java.io.IOException;
public class FileInputStreamExample {
public static void main(String[] args) {
try (FileInputStream fis = new FileInputStream("example.txt")) {
int data;
while ((data = fis.read()) != -1) {
System.out.print((char) data); // Print the byte as a character
}
} catch (IOException e) {
System.out.println("An error occurred while reading the file.");
e.printStackTrace();
}
}
}
ব্যাখ্যা:
- FileInputStream ব্যবহার করা হয়েছে একটি ফাইল থেকে ডেটা পড়তে।
fis.read()প্রতিবার একটি বাইট পড়ে এবং তা character হিসাবে প্রিন্ট করা হয়েছে।
ফাইলে ডেটা লেখা (OutputStream):
import java.io.FileOutputStream;
import java.io.IOException;
public class FileOutputStreamExample {
public static void main(String[] args) {
String data = "Hello, this is a test!";
try (FileOutputStream fos = new FileOutputStream("output.txt")) {
fos.write(data.getBytes()); // Write string as bytes to the file
System.out.println("Data written to the file successfully.");
} catch (IOException e) {
System.out.println("An error occurred while writing to the file.");
e.printStackTrace();
}
}
}
ব্যাখ্যা:
- FileOutputStream ব্যবহার করা হয়েছে ডেটা ফাইলে লেখার জন্য।
fos.write(data.getBytes())স্ট্রিংকে বাইট অ্যারেতে রূপান্তর করে ফাইলে লেখা হয়েছে।
সারাংশ
- InputStream এবং OutputStream Java I/O সিস্টেমের মূল ক্লাস যা বাইনারি ডেটা পড়া এবং লেখা ব্যবস্থাপনা করে।
- InputStream ক্লাস ডেটা পড়ার জন্য ব্যবহৃত হয় এবং OutputStream ক্লাস ডেটা লেখার জন্য ব্যবহৃত হয়।
- FileInputStream, FileOutputStream এবং BufferedInputStream/BufferedOutputStream বিভিন্ন ক্লাসের মাধ্যমে ফাইল এবং অন্যান্য I/O সোর্সে ডেটা প্রক্রিয়া করা যায়।
- এই ক্লাসগুলোতে ব্যবহৃত read(), write(), close() ইত্যাদি মেথডগুলি ফাইল এবং স্ট্রীম পরিচালনার জন্য অত্যন্ত গুরুত্বপূর্ণ।
Read more