Java I/O System এ দুটি প্রধান ধরনের স্ট্রিম রয়েছে: Byte Streams এবং Character Streams। স্ট্রিম হলো ডেটার ক্রম, যা একটি উৎস (source) থেকে একটি গন্তব্যে (destination) প্রবাহিত হয়। স্ট্রিমের মাধ্যমে ডেটা পড়া বা লেখা সহজ এবং কার্যকর হয়।
Byte Streams
Byte Streams ডেটা বাইট (8-bit chunks) আকারে পড়া বা লেখার জন্য ব্যবহৃত হয়। এটি প্রধানত binary data (যেমন ইমেজ, ভিডিও, অথবা অন্যান্য মিডিয়া ফাইল) প্রসেসিংয়ের জন্য উপযুক্ত।
গুরুত্বপূর্ণ ক্লাস:
- InputStream: ডেটা উৎস থেকে বাইট পড়তে ব্যবহৃত হয়।
- OutputStream: ডেটা গন্তব্যে বাইট লিখতে ব্যবহৃত হয়।
গুরুত্বপূর্ণ সাব-ক্লাস:
| ক্লাস | ব্যবহার |
|---|---|
FileInputStream | একটি ফাইল থেকে ডেটা পড়ার জন্য। |
FileOutputStream | একটি ফাইলে ডেটা লেখার জন্য। |
BufferedInputStream | ইনপুট কার্যক্রম বাফার করে দ্রুত করার জন্য। |
BufferedOutputStream | আউটপুট কার্যক্রম বাফার করে দ্রুত করার জন্য। |
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); // ইনপুট থেকে পড়া ডেটা আউটপুটে লেখা।
}
System.out.println("File copied successfully using Byte Streams.");
} catch (IOException e) {
e.printStackTrace();
}
}
}
Character Streams
Character Streams ডেটা ক্যারেক্টার (16-bit chunks) আকারে পড়া বা লেখার জন্য ব্যবহৃত হয়। এটি প্রধানত text-based data প্রসেসিংয়ের জন্য উপযুক্ত।
গুরুত্বপূর্ণ ক্লাস:
- Reader: টেক্সট উৎস থেকে ক্যারেক্টার পড়ার জন্য।
- Writer: টেক্সট গন্তব্যে ক্যারেক্টার লেখার জন্য।
গুরুত্বপূর্ণ সাব-ক্লাস:
| ক্লাস | ব্যবহার |
|---|---|
FileReader | একটি ফাইল থেকে টেক্সট পড়ার জন্য। |
FileWriter | একটি ফাইলে টেক্সট লেখার জন্য। |
BufferedReader | ইনপুট কার্যক্রম বাফার করে দ্রুত করার জন্য। |
BufferedWriter | আউটপুট কার্যক্রম বাফার করে দ্রুত করার জন্য। |
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); // ইনপুট থেকে পড়া টেক্সট আউটপুটে লেখা।
}
System.out.println("File copied successfully using Character Streams.");
} catch (IOException e) {
e.printStackTrace();
}
}
}
Byte Streams বনাম Character Streams
| বিষয় | Byte Streams | Character Streams |
|---|---|---|
| ডেটা ইউনিট | বাইট (8-bit)। | ক্যারেক্টার (16-bit)। |
| ব্যবহার ক্ষেত্র | Binary data (ইমেজ, ভিডিও, অডিও)। | Text-based data (String বা টেক্সট ফাইল)। |
| ক্লাস | InputStream, OutputStream। | Reader, Writer। |
| দ্রুততা | ছোট ফাইলের জন্য দ্রুত। | বড় টেক্সট ফাইলের জন্য কার্যকর। |
| বাফারিং | BufferedInputStream, BufferedOutputStream। | BufferedReader, BufferedWriter। |
Tuple এর সাথে Byte এবং Character Streams এর ব্যবহার
Tuple ব্যবহার করে ফাইল ডেটা এবং সাইজ সংরক্ষণ
import java.io.FileReader;
import java.io.IOException;
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() + " characters");
}
public static Tuple<String, Integer> readFile(String fileName) {
StringBuilder content = new StringBuilder();
int size = 0;
try (FileReader fr = new FileReader(fileName)) {
int charData;
while ((charData = fr.read()) != -1) {
content.append((char) charData);
size++;
}
} catch (IOException e) {
e.printStackTrace();
}
return new Tuple<>(content.toString(), size);
}
}
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;
}
}
আউটপুট:
File Content: This is a test file.
File Size: 20 characters
Byte Streams:
- Binary Data: ইমেজ, অডিও, বা অন্যান্য বাইনারি ফাইল প্রসেসিং।
- ক্লাস:
InputStream,OutputStream।
Character Streams:
- Text Data: টেক্সট ফাইল বা স্ট্রিং প্রসেসিং।
- ক্লাস:
Reader,Writer।
Tuple Integration:
- ডেটা স্ট্রিমের ডেটা এবং প্রোপার্টি (যেমন সাইজ) একত্রে সংরক্ষণ করতে Tuples ব্যবহার করা যেতে পারে।
স্ট্রিমের সঠিক প্রকার এবং উপযুক্ত কৌশল ব্যবহার করে আপনার অ্যাপ্লিকেশনের কার্যকারিতা বাড়ান।
Byte Streams হলো Java Input/Output (I/O) সিস্টেমের একটি অংশ, যা বাইনারি ডেটা পড়া এবং লেখার জন্য ব্যবহৃত হয়। এগুলো raw bytes হিসেবে ডেটা হ্যান্ডেল করে এবং ফাইল, নেটওয়ার্ক, বা অন্য বাইনারি ডেটা সোর্স থেকে ডেটা প্রসেস করার জন্য কার্যকর।
Byte Streams এর প্রধান বৈশিষ্ট্য
- Raw Data Handling:
- Byte Streams মূলত বাইনারি ডেটা পড়া এবং লেখার জন্য ব্যবহৃত হয়।
- এটি টেক্সট, ইমেজ, অডিও, ভিডিও, এবং অন্যান্য বাইনারি ফাইল প্রসেস করতে সক্ষম।
- Classes:
- Java Byte Streams I/O অপারেশনের জন্য দুটি প্রধান ক্লাস প্রদান করে:
- InputStream: বাইনারি ডেটা পড়ার জন্য।
- OutputStream: বাইনারি ডেটা লেখার জন্য।
- Java Byte Streams I/O অপারেশনের জন্য দুটি প্রধান ক্লাস প্রদান করে:
- Data Representation:
- Byte Streams bytes (8-bit) হিসেবে ডেটা হ্যান্ডেল করে।
- No Character Encoding:
- Byte Streams কোনো চরিত্র এনকোডিং নিয়ে কাজ করে না। এটি শুধুমাত্র raw bytes পড়ে বা লেখে।
Byte Streams এর গুরুত্বপূর্ণ ক্লাসসমূহ
InputStream (বাইনারি ডেটা পড়ার জন্য):
- FileInputStream: ফাইল থেকে ডেটা পড়তে।
- BufferedInputStream: ডেটা পড়ার পারফরম্যান্স বাড়াতে বাফারিং।
- DataInputStream: প্রিমিটিভ ডেটা টাইপ পড়তে।
OutputStream (বাইনারি ডেটা লেখার জন্য):
- FileOutputStream: ফাইল এ ডেটা লেখার জন্য।
- BufferedOutputStream: লেখার পারফরম্যান্স বাড়াতে বাফারিং।
- DataOutputStream: প্রিমিটিভ ডেটা টাইপ লেখার জন্য।
Byte Streams এর ব্যবহার ক্ষেত্র
১. বাইনারি ফাইল হ্যান্ডলিং
- ইমেজ, অডিও, ভিডিও, বা যেকোনো বাইনারি ফাইল পড়া বা লেখার জন্য Byte Streams ব্যবহার করা হয়।
Example: Reading a Binary File
import java.io.FileInputStream;
import java.io.IOException;
public class ByteStreamExample {
public static void main(String[] args) {
try (FileInputStream fis = new FileInputStream("example.bin")) {
int data;
while ((data = fis.read()) != -1) {
System.out.print(data + " "); // Printing bytes
}
} catch (IOException e) {
e.printStackTrace();
}
}
}
২. ডেটা লেখার জন্য
- বাইনারি ডেটা (যেমন: ইমেজ বা ভিডিও) ফাইলে লেখার জন্য।
Example: Writing Binary Data
import java.io.FileOutputStream;
import java.io.IOException;
public class ByteStreamWriteExample {
public static void main(String[] args) {
byte[] data = {65, 66, 67, 68}; // ASCII values for A, B, C, D
try (FileOutputStream fos = new FileOutputStream("output.bin")) {
fos.write(data);
} catch (IOException e) {
e.printStackTrace();
}
}
}
৩. নেটওয়ার্ক ডেটা ট্রান্সফার
- নেটওয়ার্কের মাধ্যমে বাইনারি ডেটা ট্রান্সফার করার সময় Byte Streams ব্যবহার করা হয়।
Example: Sending Data over a Network
import java.io.OutputStream;
import java.net.Socket;
public class NetworkByteStreamExample {
public static void main(String[] args) {
try (Socket socket = new Socket("localhost", 5000)) {
OutputStream outputStream = socket.getOutputStream();
outputStream.write("Hello, Server".getBytes());
} catch (Exception e) {
e.printStackTrace();
}
}
}
৪. Object Serialization
- ObjectOutputStream এবং ObjectInputStream ব্যবহার করে অবজেক্ট সিরিয়ালাইজ এবং ডেসিরিয়ালাইজ করা।
Example: Serializing an Object
import java.io.FileOutputStream;
import java.io.ObjectOutputStream;
import java.io.Serializable;
class Employee implements Serializable {
private String name;
private int age;
public Employee(String name, int age) {
this.name = name;
this.age = age;
}
}
public class SerializationExample {
public static void main(String[] args) {
Employee employee = new Employee("Alice", 30);
try (ObjectOutputStream oos = new ObjectOutputStream(new FileOutputStream("employee.ser"))) {
oos.writeObject(employee);
} catch (Exception e) {
e.printStackTrace();
}
}
}
কখন Byte Streams ব্যবহার করবেন?
- Raw Binary Data:
- যখন আপনার ডেটা বাইনারি ফরম্যাটে এবং এনকোডিং সম্পর্কে চিন্তা করতে হয় না।
- উদাহরণ: ইমেজ, ভিডিও, বা বাইনারি লগ ফাইল।
- Efficiency in Binary Operations:
- যখন দ্রুত বাইনারি ডেটা প্রসেস করা দরকার।
- উদাহরণ: নেটওয়ার্ক ডেটা ট্রান্সফার।
- Serialization and Deserialization:
- যখন অবজেক্ট সিরিয়ালাইজ করতে বা পুনঃনির্মাণ করতে হয়।
- Cross-Language Interoperability:
- যখন অন্য ভাষা (যেমন Python, C++)-এর সাথে বাইনারি ডেটা শেয়ার করতে হয়।
Byte Streams এর সুবিধা
- Raw Data Handling:
- Character Encoding নিয়ে চিন্তা না করে সরাসরি বাইনারি ডেটা হ্যান্ডেল করতে সক্ষম।
- Low-Level Control:
- ডেটা প্রসেসিংয়ে উচ্চতর কন্ট্রোল প্রদান করে।
- Efficiency:
- বড় আকারের বাইনারি ডেটা প্রসেসিংয়ের জন্য কার্যকর।
- Compatibility:
- বিভিন্ন ফাইল টাইপ এবং নেটওয়ার্ক প্রোটোকলের সাথে ব্যবহারযোগ্য।
Byte Streams এর সীমাবদ্ধতা
- Character Handling Support নেই:
- Character Data প্রসেস করার জন্য Byte Streams সরাসরি ব্যবহার উপযোগী নয়।
- Complexity in Large Files:
- বড় আকারের ফাইল প্রসেসিংয়ের সময় অতিরিক্ত জটিলতা তৈরি হতে পারে।
- Error Handling:
- যথাযথ Error Handling না থাকলে ডেটা লস হতে পারে।
Byte Streams এবং Tuples এর Integration
১. Binary Data এবং Metadata সংরক্ষণ
Tuples ব্যবহার করে বাইনারি ডেটা এবং তার মেটাডেটা একত্রে সংরক্ষণ করা যায়।
Example:
import io.vavr.Tuple;
import io.vavr.Tuple2;
import java.io.FileInputStream;
public class ByteStreamTupleExample {
public static void main(String[] args) {
try (FileInputStream fis = new FileInputStream("example.bin")) {
byte[] data = fis.readAllBytes();
Tuple2<String, byte[]> fileData = Tuple.of("example.bin", data);
System.out.println("File Name: " + fileData._1);
System.out.println("Data Length: " + fileData._2.length);
} catch (Exception e) {
e.printStackTrace();
}
}
}
Byte Streams প্রধানত বাইনারি ডেটা প্রসেস করার জন্য ব্যবহৃত হয় এবং এটি ইমেজ, ভিডিও, নেটওয়ার্ক ডেটা, এবং সিরিয়ালাইজেশন অপারেশনের ক্ষেত্রে গুরুত্বপূর্ণ। Tuples ব্যবহার করে Byte Streams-এর সাথে ডেটা এবং মেটাডেটা আরও কার্যকরভাবে পরিচালনা করা যায়।
Best Practice:
- বাইনারি ডেটার জন্য Byte Streams ব্যবহার করুন।
- যখন মেটাডেটা প্রয়োজন, Tuples ব্যবহার করুন।
Character Streams জাভাতে টেক্সট ফাইল বা টেক্সট ডেটা পড়া এবং লেখার জন্য ব্যবহৃত হয়। এটি সাধারণত Reader এবং Writer ক্লাসগুলোর উপর ভিত্তি করে কাজ করে। Javatuples ব্যবহার করে Character Streams থেকে ডেটা সংগ্রহ করে সেটিকে আরও সহজে এবং কার্যকরভাবে ম্যানিপুলেট করা যায়।
Character Streams এর ধারণা
- Reader: টেক্সট ডেটা পড়ার জন্য ব্যবহৃত হয় (ইনপুট স্ট্রিম)।
- উদাহরণ:
FileReader,BufferedReader
- উদাহরণ:
- Writer: টেক্সট ডেটা লেখার জন্য ব্যবহৃত হয় (আউটপুট স্ট্রিম)।
- উদাহরণ:
FileWriter,BufferedWriter
- উদাহরণ:
Tuples এর সাথে Character Streams এর Integration
১. ফাইল থেকে ডেটা পড়া এবং Tuples এ সংরক্ষণ
Character Streams ব্যবহার করে একটি ফাইল থেকে ডেটা পড়ে Tuples এ সংরক্ষণ করা যায়।
উদাহরণ:
import org.javatuples.Pair;
import java.io.BufferedReader;
import java.io.FileReader;
import java.io.IOException;
import java.util.ArrayList;
import java.util.List;
public class CharacterStreamWithTuples {
public static void main(String[] args) {
String filePath = "data.txt";
// Tuples List to store data
List<Pair<String, Integer>> dataList = new ArrayList<>();
try (BufferedReader reader = new BufferedReader(new FileReader(filePath))) {
String line;
// Reading file line by line
while ((line = reader.readLine()) != null) {
String[] parts = line.split(",");
if (parts.length == 2) {
String name = parts[0].trim();
Integer age = Integer.parseInt(parts[1].trim());
dataList.add(Pair.with(name, age)); // Storing in Tuple
}
}
} catch (IOException e) {
e.printStackTrace();
}
// Displaying data
for (Pair<String, Integer> data : dataList) {
System.out.println("Name: " + data.getValue0() + ", Age: " + data.getValue1());
}
}
}
Sample Input File (data.txt):
Alice, 25
Bob, 30
Charlie, 35
আউটপুট:
Name: Alice, Age: 25
Name: Bob, Age: 30
Name: Charlie, Age: 35
২. Tuples ব্যবহার করে ফাইল লেখার সময় Character Streams
Tuples এর ডেটা একটি ফাইলে লেখার জন্য Writer ব্যবহার করা হয়।
উদাহরণ:
import org.javatuples.Pair;
import java.io.BufferedWriter;
import java.io.FileWriter;
import java.io.IOException;
import java.util.ArrayList;
import java.util.List;
public class WriteTuplesToFile {
public static void main(String[] args) {
String filePath = "output.txt";
// Data to write
List<Pair<String, Integer>> dataList = new ArrayList<>();
dataList.add(Pair.with("Alice", 25));
dataList.add(Pair.with("Bob", 30));
dataList.add(Pair.with("Charlie", 35));
try (BufferedWriter writer = new BufferedWriter(new FileWriter(filePath))) {
for (Pair<String, Integer> data : dataList) {
writer.write(data.getValue0() + ", " + data.getValue1());
writer.newLine();
}
} catch (IOException e) {
e.printStackTrace();
}
System.out.println("Data written to file successfully.");
}
}
আউটপুট ফাইল (output.txt):
Alice, 25
Bob, 30
Charlie, 35
Advanced Example: Filter এবং Sort করার পরে Tuples ফাইলে লেখা
উদাহরণ:
import org.javatuples.Pair;
import java.io.*;
import java.util.ArrayList;
import java.util.Comparator;
import java.util.List;
public class FilterSortWriteTuples {
public static void main(String[] args) {
String inputFilePath = "data.txt";
String outputFilePath = "filtered_sorted_output.txt";
// Tuples List to store data
List<Pair<String, Integer>> dataList = new ArrayList<>();
// Reading from file
try (BufferedReader reader = new BufferedReader(new FileReader(inputFilePath))) {
String line;
while ((line = reader.readLine()) != null) {
String[] parts = line.split(",");
if (parts.length == 2) {
String name = parts[0].trim();
Integer age = Integer.parseInt(parts[1].trim());
dataList.add(Pair.with(name, age));
}
}
} catch (IOException e) {
e.printStackTrace();
}
// Filtering and Sorting
dataList.stream()
.filter(data -> data.getValue1() > 25) // Filter Age > 25
.sorted(Comparator.comparing(Pair::getValue1)) // Sort by Age
.forEach(System.out::println);
// Writing filtered and sorted data to file
try (BufferedWriter writer = new BufferedWriter(new FileWriter(outputFilePath))) {
for (Pair<String, Integer> data : dataList) {
if (data.getValue1() > 25) {
writer.write(data.getValue0() + ", " + data.getValue1());
writer.newLine();
}
}
} catch (IOException e) {
e.printStackTrace();
}
System.out.println("Filtered and sorted data written to file successfully.");
}
}
Character Streams এর সাথে Tuples ব্যবহারের সুবিধা
- ডেটার সংগঠিত গঠন:
- Tuples ব্যবহার করে ফাইল থেকে ফেচ করা ডেটা গোষ্ঠীভুক্ত করা যায়।
- Immutability:
- Tuples Immutable হওয়ায় ডেটা পরিবর্তন হওয়ার ঝুঁকি থাকে না।
- Readable Code:
- Tuples ব্যবহার করে কোড আরও সংক্ষিপ্ত এবং সহজে পড়া যায়।
- Integration with Streams API:
- Tuples সহজেই Java Streams API এর সাথে কাজ করতে পারে।
Best Practices
- Stream ব্যবহার করুন:
- ফাইল পড়া এবং লেখার সময়
Streams APIব্যবহার করে কার্যক্ষমতা বাড়ান।
- ফাইল পড়া এবং লেখার সময়
- Input Validation:
- ফাইলের ডেটা পড়ার সময় যথাযথ ফরম্যাট চেক করুন।
- Error Handling:
try-with-resourcesব্যবহার করুন যাতে ফাইল স্বয়ংক্রিয়ভাবে বন্ধ হয়।
- File Path Management:
- ফাইলের অবস্থান এবং নাম সঠিকভাবে সংজ্ঞায়িত করুন।
Character Streams এবং Javatuples একত্রে ব্যবহার করে জাভাতে ফাইল থেকে ডেটা ফেচ এবং লেখার কাজ আরও সহজ এবং কার্যকর করা যায়। Tuples এর Immutable বৈশিষ্ট্য এবং সহজ ডেটা ম্যানিপুলেশনের ক্ষমতা Character Streams এর সাথে একত্রিত হলে একটি অত্যন্ত শক্তিশালী সমাধান প্রদান করে। সঠিকভাবে এই দুটি প্রযুক্তি ব্যবহার করলে ডেটা হ্যান্ডলিং আরও নিরাপদ এবং রিডেবল হয়।
জাভাতে Byte Streams এবং Character Streams হলো দুটি পৃথক স্ট্রিম ক্লাস, যা I/O (Input/Output) অপারেশনের জন্য ব্যবহৃত হয়। এই দুটি স্ট্রিমের কাজ এবং ব্যবহারের ক্ষেত্র ভিন্ন, কারণ তারা বিভিন্ন ধরনের ডেটা পরিচালনা করে।
Byte Streams
- ডেটার ধরন:
- Byte Streams মূলত বাইনারি ডেটা (byte, 8-bit data) পরিচালনা করে।
- যেমন: ইমেজ, ভিডিও, অডিও, এবং বাইনারি ফাইল।
- মূল ক্লাস:
- InputStream (পড়ার জন্য)
- OutputStream (লেখার জন্য)
- প্রধান উদাহরণ:
FileInputStream,FileOutputStream,BufferedInputStream,BufferedOutputStream.
- উপযোগিতা:
- বাইনারি ডেটার ক্ষেত্রে কার্যকর, যেখানে ডেটার এনকোডিং গুরুত্বপূর্ণ নয়।
উদাহরণ:
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 data;
while ((data = fis.read()) != -1) {
fos.write(data);
}
System.out.println("File copied using Byte Streams.");
} catch (IOException e) {
e.printStackTrace();
}
}
}
Character Streams
- ডেটার ধরন:
- Character Streams টেক্সট ডেটা (character, 16-bit data) পরিচালনা করে।
- যেমন: টেক্সট ফাইল, JSON, XML।
- মূল ক্লাস:
- Reader (পড়ার জন্য)
- Writer (লেখার জন্য)
- প্রধান উদাহরণ:
FileReader,FileWriter,BufferedReader,BufferedWriter.
- উপযোগিতা:
- টেক্সট ডেটা পরিচালনার ক্ষেত্রে কার্যকর, যেখানে ডেটার এনকোডিং (যেমন UTF-8, UTF-16) গুরুত্বপূর্ণ।
উদাহরণ:
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 data;
while ((data = fr.read()) != -1) {
fw.write(data);
}
System.out.println("File copied using Character Streams.");
} catch (IOException e) {
e.printStackTrace();
}
}
}
Byte Streams এবং Character Streams এর পার্থক্য
| বৈশিষ্ট্য | Byte Streams | Character Streams |
|---|---|---|
| ডেটার ধরন | বাইনারি ডেটা (8-bit data) | টেক্সট ডেটা (16-bit data) |
| মূল ক্লাস | InputStream এবং OutputStream | Reader এবং Writer |
| ডেটা প্রক্রিয়াকরণ | বাইনারি ডেটা (ইমেজ, ভিডিও, অডিও) প্রক্রিয়াকরণ। | টেক্সট ডেটা (যেমন ফাইল, XML, JSON) প্রক্রিয়াকরণ। |
| এনকোডিং সমর্থন | এনকোডিং নিয়ে কাজ করে না। | এনকোডিং-aware (যেমন UTF-8, UTF-16)। |
| উদাহরণ ক্লাস | FileInputStream, BufferedInputStream, ইত্যাদি। | FileReader, BufferedReader, ইত্যাদি। |
| গতি | সাধারণত Character Streams এর তুলনায় দ্রুত। | বড় টেক্সট ডেটার জন্য উপযোগী, কিন্তু ধীর। |
| ব্যবহার ক্ষেত্র | ইমেজ, ভিডিও, এবং বাইনারি ডেটার ক্ষেত্রে। | টেক্সট ফাইল এবং টেক্সট ডেটার ক্ষেত্রে। |
কোথায় কোনটি ব্যবহার করবেন
Byte Streams:
- বাইনারি ডেটার জন্য: যেমন ইমেজ, ভিডিও, এবং এনক্রিপ্টেড ফাইল।
- যখন ডেটার এনকোডিং গুরুত্বপূর্ণ নয়।
Character Streams:
- টেক্সট ডেটার জন্য: যেমন JSON, XML, বা সাধারণ টেক্সট ফাইল।
- যখন ডেটার এনকোডিং গুরুত্বপূর্ণ (UTF-8, UTF-16)।
Byte Streams এবং Character Streams একসঙ্গে ব্যবহার
যদি একটি ফাইলের কিছু অংশ বাইনারি ডেটা এবং কিছু অংশ টেক্সট ডেটা হয়, তবে Byte এবং Character Streams একত্রে ব্যবহার করা যায়।
উদাহরণ:
import java.io.*;
public class CombinedStreamExample {
public static void main(String[] args) {
try (FileInputStream fis = new FileInputStream("data.bin");
InputStreamReader isr = new InputStreamReader(fis);
BufferedReader br = new BufferedReader(isr)) {
String line;
while ((line = br.readLine()) != null) {
System.out.println(line); // টেক্সট ডেটা পড়া
}
} catch (IOException e) {
e.printStackTrace();
}
}
}
Byte Streams এবং Character Streams জাভার I/O অপারেশনের জন্য গুরুত্বপূর্ণ। সঠিক স্ট্রিম নির্বাচন করলে ডেটা প্রক্রিয়াকরণ আরও কার্যকর এবং সহজ হয়।
- Byte Streams: বাইনারি ডেটা (ইমেজ, ভিডিও) প্রক্রিয়াকরণে সেরা।
- Character Streams: টেক্সট ডেটা (JSON, XML) প্রক্রিয়াকরণে কার্যকর।
আপনার অ্যাপ্লিকেশনের প্রয়োজন অনুযায়ী সঠিক স্ট্রিম নির্বাচন করুন।
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