InputStream এবং OutputStream ক্লাস হল জাভার I/O System এর বেসিক ক্লাস, যা java.io প্যাকেজের অংশ। এই ক্লাস দুটি Byte Streams-এর মাধ্যমে ডেটা প্রবাহ (streaming) পরিচালনা করে। InputStream ডেটা পড়ার জন্য এবং OutputStream ডেটা লেখার জন্য ব্যবহৃত হয়।
InputStream ক্লাসের ভূমিকা
- InputStream ডেটা বাইট আকারে পড়তে ব্যবহৃত হয়।
- এটি একটি অ্যাবস্ট্রাক্ট ক্লাস, যা বিভিন্ন ডেটা সোর্স (যেমন ফাইল, নেটওয়ার্ক, বা মেমোরি) থেকে ডেটা পড়ার জন্য সাবক্লাস প্রদান করে।
InputStream এর গুরুত্বপূর্ণ মেথড:
| মেথড | বিবরণ |
|---|---|
int read() | একটি বাইট পড়ে এবং এটিকে রিটার্ন করে। EOF (-1) হলে -1 রিটার্ন। |
int read(byte[] b) | একটি বাফারে একাধিক বাইট পড়ে। |
int available() | ইনপুট স্ট্রিমে পড়ার জন্য কতটুকু ডেটা রয়েছে তা জানায়। |
void close() | স্ট্রিম বন্ধ করে। |
InputStream এর সাব-ক্লাস:
- FileInputStream: একটি ফাইল থেকে ডেটা পড়ে।
- BufferedInputStream: ডেটা পড়ার গতি বাড়ানোর জন্য বাফারিং করে।
- ByteArrayInputStream: একটি বাইট অ্যারে থেকে ডেটা পড়ে।
OutputStream ক্লাসের ভূমিকা
- OutputStream ডেটা বাইট আকারে গন্তব্যে লেখার জন্য ব্যবহৃত হয়।
- এটি একটি অ্যাবস্ট্রাক্ট ক্লাস, যা বিভিন্ন গন্তব্যে (যেমন ফাইল, নেটওয়ার্ক, বা মেমোরি) ডেটা লেখার জন্য সাবক্লাস প্রদান করে।
OutputStream এর গুরুত্বপূর্ণ মেথড:
| মেথড | বিবরণ |
|---|---|
void write(int b) | একটি বাইট গন্তব্যে লেখে। |
void write(byte[] b) | একটি বাফার থেকে ডেটা লেখে। |
void flush() | স্ট্রিমে জমা থাকা সমস্ত ডেটা গন্তব্যে পাঠায়। |
void close() | স্ট্রিম বন্ধ করে। |
OutputStream এর সাব-ক্লাস:
- FileOutputStream: একটি ফাইলে ডেটা লেখে।
- BufferedOutputStream: ডেটা লেখার গতি বাড়ানোর জন্য বাফারিং করে।
- ByteArrayOutputStream: একটি বাইট অ্যারেতে ডেটা লেখে।
InputStream এবং OutputStream ব্যবহারিক উদাহরণ
১. ফাইল থেকে ডেটা পড়া (InputStream ব্যবহার করে)
import java.io.FileInputStream;
import java.io.IOException;
public class InputStreamExample {
public static void main(String[] args) {
try (FileInputStream fis = new FileInputStream("input.txt")) {
int byteData;
while ((byteData = fis.read()) != -1) {
System.out.print((char) byteData); // বাইটকে ক্যারেক্টারে কনভার্ট করে প্রিন্ট
}
} catch (IOException e) {
e.printStackTrace();
}
}
}
উদাহরণ ফাইল (input.txt):
This is a test file.
আউটপুট:
This is a test file.
২. ফাইলে ডেটা লেখা (OutputStream ব্যবহার করে)
import java.io.FileOutputStream;
import java.io.IOException;
public class OutputStreamExample {
public static void main(String[] args) {
String data = "This is a test output.";
try (FileOutputStream fos = new FileOutputStream("output.txt")) {
fos.write(data.getBytes()); // String থেকে বাইট অ্যারে রূপান্তর করে লেখে
System.out.println("Data written to file successfully.");
} catch (IOException e) {
e.printStackTrace();
}
}
}
ফলাফল (output.txt):
This is a test output.
৩. InputStream এবং OutputStream ব্যবহার করে ফাইল কপি করা
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.IOException;
public class FileCopyExample {
public static void main(String[] args) {
try (FileInputStream fis = new FileInputStream("input.txt");
FileOutputStream fos = new FileOutputStream("copy.txt")) {
int byteData;
while ((byteData = fis.read()) != -1) {
fos.write(byteData); // ইনপুট থেকে পড়ে আউটপুটে লেখে
}
System.out.println("File copied successfully.");
} catch (IOException e) {
e.printStackTrace();
}
}
}
ফলাফল:
- input.txt এর কন্টেন্ট copy.txt-এ কপি হবে।
InputStream এবং OutputStream বনাম Character Streams
| বিষয় | InputStream/OutputStream | Reader/Writer (Character Streams) |
|---|---|---|
| ডেটা টাইপ | বাইট (8-bit)। | ক্যারেক্টার (16-bit)। |
| ব্যবহার ক্ষেত্র | বাইনারি ডেটা (ইমেজ, ভিডিও, অডিও)। | টেক্সট ডেটা (String বা টেক্সট ফাইল)। |
| ক্লাস | InputStream, OutputStream। | Reader, Writer। |
| উদ্দেশ্য | বাইনারি ডেটার জন্য। | টেক্সট ডেটার জন্য। |
Tuple এর সাথে InputStream এবং OutputStream এর ব্যবহার
Tuple ব্যবহার করে ফাইলের ডেটা এবং আকার সংরক্ষণ
import java.io.FileInputStream;
import java.io.IOException;
class Tuple<T1, T2> {
private final T1 first;
private final T2 second;
public Tuple(T1 first, T2 second) {
this.first = first;
this.second = second;
}
public T1 getFirst() {
return first;
}
public T2 getSecond() {
return second;
}
}
public class TupleStreamExample {
public static void main(String[] args) {
Tuple<String, Integer> fileData = readFile("input.txt");
System.out.println("File Content: " + fileData.getFirst());
System.out.println("File Size: " + fileData.getSecond() + " bytes");
}
public static Tuple<String, Integer> readFile(String filePath) {
StringBuilder content = new StringBuilder();
int size = 0;
try (FileInputStream fis = new FileInputStream(filePath)) {
int byteData;
while ((byteData = fis.read()) != -1) {
content.append((char) byteData);
size++;
}
} catch (IOException e) {
e.printStackTrace();
}
return new Tuple<>(content.toString(), size);
}
}
আউটপুট:
File Content: This is a test file.
File Size: 20 bytes
InputStream এবং OutputStream এর সুবিধা
- Binary Data Support: ইমেজ, ভিডিও এবং অন্যান্য বাইনারি ডেটা পরিচালনা করতে কার্যকর।
- Performance: বড় বাইনারি ফাইল পরিচালনায় দক্ষ।
- Flexibility: বিভিন্ন ডেটা সোর্স এবং গন্তব্যের সাথে সংযুক্ত হতে সক্ষম।
InputStream এবং OutputStream এর সীমাবদ্ধতা
- Low-Level API: Character Streams এর তুলনায় ব্যবহার করতে বেশি কোড প্রয়োজন।
- Text Data Handling: টেক্সট ফাইল পরিচালনার জন্য অতিরিক্ত কনভার্সন প্রয়োজন।
- Buffering Required: বড় ফাইল পরিচালনার সময় বাফারিং ব্যবহার করতে হয়।
InputStream এবং OutputStream জাভার I/O সিস্টেমে বেসিক ভূমিকা পালন করে। এগুলো প্রধানত বাইনারি ডেটা পরিচালনার জন্য ব্যবহৃত হয়।
- ছোট বা বড় ফাইলের ডেটা পড়া বা লেখার জন্য এটি কার্যকর।
- টেক্সট ডেটার ক্ষেত্রে Character Streams (Reader/Writer) ব্যবহার করা ভালো।
Tuple Integration: InputStream বা OutputStream থেকে পড়া ডেটা এবং অন্যান্য প্রোপার্টি (যেমন আকার) সংরক্ষণ করতে Tuples কার্যকরভাবে ব্যবহার করা যায়।
Read more