File Locking হল এমন একটি প্রক্রিয়া যেখানে একাধিক প্রসেস বা থ্রেডের মধ্যে একটি ফাইল বা ফাইলের অংশে অ্যাক্সেস নিয়ন্ত্রণ করা হয়। এটি মূলত ফাইলের জন্য একযোগভাবে সুরক্ষিত অ্যাক্সেস নিশ্চিত করতে ব্যবহৃত হয়, যাতে একাধিক থ্রেড বা প্রসেস এক সময়ে ফাইলটি না পড়ে বা লিখতে না পারে।
Java NIO এ FileLock ক্লাস এবং FileChannel ব্যবহার করে ফাইল লকিং বাস্তবায়ন করা হয়। এটি একটি ফাইলের উপর শেয়ার্ড বা এক্সক্লুসিভ লক অর্জন করতে সাহায্য করে, যাতে একাধিক প্রসেসের মধ্যে নিরাপদ ডেটা অ্যাক্সেস নিশ্চিত করা যায়।
File Locking কি?
File Locking হল একটি কৌশল যা ফাইলের ওপর অ্যাক্সেস কন্ট্রোল প্রদান করে। এটি একাধিক থ্রেড বা প্রসেসের মধ্যে একই ফাইল বা ফাইল অংশে একযোগভাবে অ্যাক্সেসের ক্ষেত্রে সিঙ্ক্রোনাইজেশন প্রক্রিয়া সরবরাহ করে।
- Shared Lock: একাধিক প্রসেস বা থ্রেড একই সময়ে ফাইল পড়তে পারে, তবে কেউ লিখতে পারে না।
- Exclusive Lock: একটি একক প্রসেস বা থ্রেড শুধুমাত্র ফাইলটি পড়তে বা লিখতে পারবে, অন্যরা এতে অ্যাক্সেস করতে পারবে না।
Java NIO তে File Locking বাস্তবায়ন
Java NIO তে FileLock ক্লাস এবং FileChannel ব্যবহার করে ফাইল লক করা যায়। যখন একটি ফাইল লক করা হয়, তখন অন্য যে কোনো প্রসেস বা থ্রেড সেই ফাইলের উপর নির্দিষ্ট লক না মুচলে অ্যাক্সেস পেতে পারে না।
উদাহরণ: File Locking (Exclusive Lock)
এখানে একটি উদাহরণ দেওয়া হলো যেখানে Java NIO এর মাধ্যমে ফাইলের উপর Exclusive Lock প্রয়োগ করা হয়েছে।
import java.io.RandomAccessFile;
import java.nio.channels.FileChannel;
import java.nio.channels.FileLock;
import java.nio.ByteBuffer;
public class FileLockingExample {
public static void main(String[] args) {
RandomAccessFile file = null;
FileChannel channel = null;
FileLock lock = null;
try {
// ফাইল ওপেন করা
file = new RandomAccessFile("example.txt", "rw");
channel = file.getChannel();
// Exclusive Lock নেওয়া
lock = channel.lock();
System.out.println("File is locked, now writing data...");
// ডেটা লেখার জন্য ByteBuffer তৈরি
String data = "Hello, Java NIO File Locking!";
ByteBuffer buffer = ByteBuffer.allocate(1024);
buffer.clear();
buffer.put(data.getBytes());
buffer.flip();
// ফাইলের মধ্যে ডেটা লেখা
channel.write(buffer);
System.out.println("Data written to file.");
// কিছু সময় অপেক্ষা করা
Thread.sleep(5000); // 5 সেকেন্ডের জন্য অপেক্ষা করুন
} catch (Exception e) {
e.printStackTrace();
} finally {
try {
// লক মুছে ফেলা
if (lock != null && lock.isValid()) {
lock.release();
System.out.println("File lock released.");
}
// চ্যানেল এবং ফাইল বন্ধ করা
if (channel != null) channel.close();
if (file != null) file.close();
} catch (Exception e) {
e.printStackTrace();
}
}
}
}
ব্যাখ্যা:
- FileChannel: এটি ফাইল থেকে ডেটা পড়া এবং লেখার জন্য ব্যবহৃত হয়।
- FileLock: এটি ফাইলের উপর লক স্থাপন করে। এখানে
channel.lock()মেথড ব্যবহার করা হয়েছে যা Exclusive Lock দেয়, যার ফলে অন্য কোন প্রসেস এই ফাইলটি এক্সেস করতে পারবে না যতক্ষণ না এটি মুক্ত করা হয়। - ByteBuffer: এটি ডেটাকে FileChannel এর মাধ্যমে ফাইলে লেখা জন্য ব্যবহৃত হয়।
- Release Lock: লকটি মুক্ত করার জন্য
lock.release()মেথড ব্যবহার করা হয়, যাতে অন্য কোন প্রসেস বা থ্রেড ফাইলটির উপর কাজ করতে পারে।
উদাহরণ: File Locking (Shared Lock)
এখানে একটি উদাহরণ দেওয়া হলো যেখানে Shared Lock ব্যবহৃত হচ্ছে। এতে একাধিক প্রসেস একই সময় ফাইলটি পড়তে পারবে, তবে লেখার জন্য শুধুমাত্র একেই অনুমতি থাকবে।
import java.io.RandomAccessFile;
import java.nio.channels.FileChannel;
import java.nio.channels.FileLock;
import java.nio.ByteBuffer;
public class SharedFileLockExample {
public static void main(String[] args) {
RandomAccessFile file = null;
FileChannel channel = null;
FileLock lock = null;
try {
// ফাইল ওপেন করা
file = new RandomAccessFile("example.txt", "r");
channel = file.getChannel();
// Shared Lock নেওয়া
lock = channel.lock(0, Long.MAX_VALUE, true);
System.out.println("Shared lock acquired, now reading data...");
// ডেটা পড়ার জন্য ByteBuffer তৈরি
ByteBuffer buffer = ByteBuffer.allocate(1024);
channel.read(buffer);
buffer.flip();
// ফাইল থেকে পড়া ডেটা দেখানো
while (buffer.hasRemaining()) {
System.out.print((char) buffer.get());
}
System.out.println();
// কিছু সময় অপেক্ষা করা
Thread.sleep(5000); // 5 সেকেন্ডের জন্য অপেক্ষা করুন
} catch (Exception e) {
e.printStackTrace();
} finally {
try {
// লক মুছে ফেলা
if (lock != null && lock.isValid()) {
lock.release();
System.out.println("Shared lock released.");
}
// চ্যানেল এবং ফাইল বন্ধ করা
if (channel != null) channel.close();
if (file != null) file.close();
} catch (Exception e) {
e.printStackTrace();
}
}
}
}
ব্যাখ্যা:
- Shared Lock: এখানে
channel.lock(0, Long.MAX_VALUE, true)মেথডটি Shared Lock দেয়, যার মানে একাধিক থ্রেড ফাইলটি পড়তে পারে, তবে শুধুমাত্র একটি থ্রেডই লেখতে পারবে। এটি non-exclusive lock। - বাকি কোডের কার্যকারিতা একই রকম, তবে এখানে শুধুমাত্র ফাইল পড়ার অপারেশন করা হচ্ছে, এবং ফাইলের লকটি মুক্ত করা হচ্ছে।
File Locking একটি গুরুত্বপূর্ণ প্রযুক্তি যা ফাইল বা ডেটার অ্যাক্সেস নিয়ন্ত্রণ করতে ব্যবহৃত হয়। Java NIO তে FileLock এবং FileChannel ব্যবহার করে এক্সক্লুসিভ এবং শেয়ার্ড লক সহ ফাইলের নিরাপদ অ্যাক্সেস নিশ্চিত করা যায়। Exclusive Lock শুধুমাত্র একটি থ্রেডকে ফাইল লিখতে দেয়, অন্যরা তা পড়তে পারে না, এবং Shared Lock একাধিক থ্রেডকে ফাইল পড়তে দেয়, তবে লেখার অনুমতি একমাত্র থ্রেডের জন্য থাকে। এটি ডেটার সুরক্ষা এবং সিঙ্ক্রোনাইজেশন নিশ্চিত করার জন্য ব্যবহৃত হয়।
Read more