File Locking এবং Synchronization হল দুইটি অত্যন্ত গুরুত্বপূর্ণ কৌশল যখন আপনি একাধিক থ্রেড বা প্রসেসের মধ্যে ফাইল বা ডিরেক্টরি ব্যবহারের সময় প্রতিযোগিতা (race conditions) থেকে সুরক্ষা নিশ্চিত করতে চান। Apache Commons IO সরাসরি ফাইল লকিংয়ের জন্য কোনো API সরবরাহ না করলেও, Java NIO (New I/O) লাইব্রেরি এবং Apache Commons IO এর স্ট্রিমগুলির সাথে একত্রে আপনি file locking এবং synchronization কৌশলগুলি কার্যকরভাবে প্রয়োগ করতে পারেন।
ফাইল লকিং এমন একটি প্রক্রিয়া, যেখানে একটি ফাইলের একাধিক থ্রেড বা প্রসেস দ্বারা একসাথে অ্যাক্সেস করা থেকে বিরত রাখা হয়। এটি মূলত race conditions এড়াতে সাহায্য করে, যেখানে একাধিক থ্রেড বা প্রসেস একই ফাইলের উপরে কাজ করতে পারে। Java NIO এর মাধ্যমে আপনি ফাইল লকিং করতে পারেন।
FileChannel এবং FileLock ক্লাস ব্যবহার করে আপনি ফাইল লক করতে পারেন। এটি একটি থ্রেড বা প্রসেসকে একটি ফাইল সম্পূর্ণভাবে অ্যাক্সেস করার অনুমতি দেয়, যতক্ষণ না তা ফাইলটি লক না করে বা ফাইলের লক মুক্ত না হয়।
import java.io.*;
import java.nio.channels.*;
import java.nio.file.*;
public class FileLockingExample {
public static void main(String[] args) {
File file = new File("example.txt");
try (RandomAccessFile randomAccessFile = new RandomAccessFile(file, "rw");
FileChannel fileChannel = randomAccessFile.getChannel()) {
// Lock the file
FileLock lock = fileChannel.lock();
// Perform file operation (e.g., write data)
System.out.println("File is locked and ready to be processed.");
// Simulate file operation
Thread.sleep(5000); // Simulating file operation for 5 seconds
// Release the lock
lock.release();
System.out.println("File lock released.");
} catch (IOException | InterruptedException e) {
e.printStackTrace();
}
}
}
এখানে:
আউটপুট:
File is locked and ready to be processed.
File lock released.
যখন আপনি একাধিক থ্রেড ব্যবহার করেন, তখন একসাথে একই ফাইল অ্যাক্সেস করার কারণে thread interference বা race conditions সৃষ্টি হতে পারে। ফাইল লকিং ব্যবহার করে এক থ্রেডের কাজ শেষ না হওয়া পর্যন্ত অন্য থ্রেডকে ফাইল অ্যাক্সেস করতে দেওয়া যাবে না।
import java.io.*;
import java.nio.channels.*;
import java.nio.file.*;
public class MultiThreadedFileLocking {
public static void main(String[] args) throws InterruptedException {
File file = new File("example.txt");
Runnable task = () -> {
try (RandomAccessFile randomAccessFile = new RandomAccessFile(file, "rw");
FileChannel fileChannel = randomAccessFile.getChannel()) {
// Lock the file
FileLock lock = fileChannel.lock();
// Perform file operation (simulating work with the file)
System.out.println(Thread.currentThread().getName() + " has locked the file.");
// Simulate file operation
Thread.sleep(3000); // Simulate work for 3 seconds
// Release the lock
lock.release();
System.out.println(Thread.currentThread().getName() + " has released the lock.");
} catch (IOException | InterruptedException e) {
e.printStackTrace();
}
};
// Run two threads concurrently
Thread thread1 = new Thread(task);
Thread thread2 = new Thread(task);
thread1.start();
thread2.start();
thread1.join();
thread2.join();
}
}
এখানে:
আউটপুট:
Thread-0 has locked the file.
Thread-0 has released the lock.
Thread-1 has locked the file.
Thread-1 has released the lock.
Apache Commons IO লাইব্রেরি সরাসরি ফাইল লকিং প্রদান না করলেও, আপনি Java NIO এর FileLock এবং FileChannel এর সাথে Commons IO স্ট্রিম ক্লাসগুলো যেমন IOUtils, FileUtils, এবং DirectoryWalker একত্রে ব্যবহার করতে পারেন। এতে ফাইল সিস্টেমের সাথে কার্যকরী synchronization এবং locking প্রক্রিয়া তৈরি হয়।
import org.apache.commons.io.FileUtils;
import java.io.File;
import java.io.IOException;
public class FileSynchronizationWithCommonsIO {
public static void main(String[] args) {
File sourceFile = new File("source.txt");
File destFile = new File("destination.txt");
// Synchronize file copying using FileUtils and a lock
synchronized (FileUtils.class) {
try {
// Perform file operation (copying in this case)
FileUtils.copyFile(sourceFile, destFile);
System.out.println("File copy operation synchronized and completed.");
} catch (IOException e) {
e.printStackTrace();
}
}
}
}
এখানে:
File Locking এবং Synchronization হল ফাইল সিস্টেমের মধ্যে data consistency নিশ্চিত করতে গুরুত্বপূর্ণ কৌশল। Java NIO এর FileLock এবং FileChannel এর সাহায্যে আপনি ফাইল লক করতে পারেন এবং Apache Commons IO লাইব্রেরির সাথে একত্রে ফাইল অপারেশনগুলিকে thread-safe এবং race condition-free করে তুলতে পারেন। Multithreading এবং synchronization কৌশলগুলি ফাইল সিস্টেমে একাধিক থ্রেডের কার্যকরী সমন্বয় নিশ্চিত করে, যা ফাইল বা ডিরেক্টরির নিরাপদ এবং দ্রুত অ্যাক্সেস প্রদান করে।
common.read_more