Apache Commons IO লাইব্রেরি DirectoryWalker ক্লাস সরবরাহ করে, যা একটি ডিরেক্টরি এবং তার ভিতরের ফাইল এবং সাব-ডিরেক্টরি রিকার্সিভলি ট্রাভার্স (ভ্রমণ) করতে সহায়ক। এটি ডিরেক্টরি ট্রাভার্সাল, ফাইল এবং সাব-ডিরেক্টরি প্রসেসিং ইত্যাদি কাজগুলির জন্য খুবই কার্যকরী।
DirectoryWalker সাধারণত কাস্টম ডিরেক্টরি প্রসেসিং কাজের জন্য ব্যবহৃত হয়, যেখানে আপনাকে ডিরেক্টরি এবং ফাইলগুলো কাস্টম শর্তে ফিল্টার করতে বা প্রক্রিয়া করতে হয়।
1. DirectoryWalker কী?
DirectoryWalker হল একটি বিমূর্ত (abstract) ক্লাস যা directory traversal এর জন্য ব্যবহৃত হয়। এটি সাধারণত একটি ডিরেক্টরি এবং তার ভিতরের সমস্ত ফাইল ও সাব-ডিরেক্টরি রিকার্সিভভাবে ট্রাভার্স করার জন্য ব্যবহৃত হয়। DirectoryWalker এ দুটি প্রধান মেথড থাকে:
- handleFile(): ফাইল প্রক্রিয়া করার জন্য।
- handleDirectory(): সাব-ডিরেক্টরি প্রক্রিয়া করার জন্য।
DirectoryWalker কে ব্যবহার করতে, আপনাকে এই ক্লাসটি ইমপ্লিমেন্ট করতে হবে এবং আপনার প্রয়োজনীয় handleFile() এবং handleDirectory() মেথডগুলো কাস্টমাইজ করতে হবে।
2. DirectoryWalker ব্যবহার করার পদ্ধতি
DirectoryWalker ব্যবহার করার জন্য আপনাকে একটি কাস্টম ক্লাস তৈরি করতে হবে যা DirectoryWalker ক্লাসটিকে এক্সটেন্ড করবে এবং তার মধ্যে ফাইল এবং ডিরেক্টরি প্রসেসিংয়ের জন্য উপযুক্ত মেথড ইমপ্লিমেন্ট করতে হবে।
2.1 DirectoryWalker কাস্টম ক্লাস তৈরি করা
DirectoryWalker এর মাধ্যমে একটি ডিরেক্টরি ট্রাভার্স করার জন্য একটি কাস্টম ক্লাস তৈরি করা যেতে পারে, যেখানে আপনি handleFile() এবং handleDirectory() মেথডগুলোকে কাস্টমাইজ করবেন।
উদাহরণ: DirectoryWalker দিয়ে ডিরেক্টরি ট্রাভার্স করা
import org.apache.commons.io.FileUtils;
import org.apache.commons.io.filefilter.TrueFileFilter;
import org.apache.commons.io.filefilter.IOFileFilter;
import org.apache.commons.io.DirectoryWalker;
import java.io.File;
import java.io.IOException;
public class CustomDirectoryWalker extends DirectoryWalker {
// কনস্ট্রাক্টর
public CustomDirectoryWalker(IOFileFilter fileFilter, IOFileFilter directoryFilter) {
super(fileFilter, directoryFilter);
}
// handleFile() মেথডটি ফাইল প্রসেস করতে ব্যবহৃত হয়
@Override
protected void handleFile(File file, int depth, java.util.List<File> results) throws IOException {
System.out.println("File: " + file.getAbsolutePath());
}
// handleDirectory() মেথডটি সাব-ডিরেক্টরি প্রসেস করতে ব্যবহৃত হয়
@Override
protected void handleDirectory(File directory, int depth, java.util.List<File> results) throws IOException {
System.out.println("Directory: " + directory.getAbsolutePath());
}
public static void main(String[] args) throws IOException {
// ডিরেক্টরি এবং ফাইল ফিল্টার
File rootDirectory = new File("path/to/directory");
IOFileFilter fileFilter = TrueFileFilter.TRUE; // সকল ফাইলকে অন্তর্ভুক্ত করবে
IOFileFilter directoryFilter = TrueFileFilter.TRUE; // সকল ডিরেক্টরিকে অন্তর্ভুক্ত করবে
// CustomDirectoryWalker ক্লাসের অবজেক্ট তৈরি
CustomDirectoryWalker walker = new CustomDirectoryWalker(fileFilter, directoryFilter);
// ডিরেক্টরি ট্রাভার্স করা
walker.walk(rootDirectory, null);
}
}
আউটপুট:
Directory: /path/to/directory
File: /path/to/directory/file1.txt
File: /path/to/directory/file2.txt
Directory: /path/to/directory/subdir
File: /path/to/directory/subdir/file3.txt
এখানে:
- handleFile() ফাংশনটি প্রতিটি ফাইলের উপর কাজ করবে এবং তার পাথ প্রিন্ট করবে।
- handleDirectory() ফাংশনটি প্রতিটি সাব-ডিরেক্টরির উপর কাজ করবে এবং তার পাথ প্রিন্ট করবে।
- walk() মেথডটি ডিরেক্টরি এবং ফাইলের ট্রাভার্সাল শুরু করবে।
2.2 FileFilter এবং DirectoryFilter ব্যবহার করা
DirectoryWalker এ FileFilter এবং DirectoryFilter ব্যবহার করে আপনি ফাইল এবং ডিরেক্টরি ফিল্টারিং করতে পারেন, যেমন শুধুমাত্র নির্দিষ্ট ধরনের ফাইল বা ডিরেক্টরি প্রসেস করা।
উদাহরণ: শুধুমাত্র .txt ফাইল প্রসেস করা
import org.apache.commons.io.filefilter.FileFilterUtils;
import org.apache.commons.io.filefilter.TrueFileFilter;
import org.apache.commons.io.DirectoryWalker;
import java.io.File;
import java.io.IOException;
public class CustomDirectoryWalker extends DirectoryWalker {
public CustomDirectoryWalker() {
super(FileFilterUtils.suffixFileFilter(".txt"), TrueFileFilter.TRUE);
}
@Override
protected void handleFile(File file, int depth, java.util.List<File> results) throws IOException {
System.out.println("Text File: " + file.getAbsolutePath());
}
@Override
protected void handleDirectory(File directory, int depth, java.util.List<File> results) throws IOException {
System.out.println("Directory: " + directory.getAbsolutePath());
}
public static void main(String[] args) throws IOException {
File rootDirectory = new File("path/to/directory");
CustomDirectoryWalker walker = new CustomDirectoryWalker();
walker.walk(rootDirectory, null);
}
}
আউটপুট:
Directory: /path/to/directory
Text File: /path/to/directory/file1.txt
Text File: /path/to/directory/file2.txt
Directory: /path/to/directory/subdir
Text File: /path/to/directory/subdir/file3.txt
এখানে:
- FileFilterUtils.suffixFileFilter(".txt") ব্যবহার করে শুধুমাত্র
.txtএক্সটেনশনযুক্ত ফাইলগুলোকেই ট্রাভার্স করার জন্য ফিল্টার করা হয়েছে। - handleFile() মেথডটি শুধুমাত্র
.txtফাইলগুলির উপর কাজ করবে এবং তাদের পাথ প্রিন্ট করবে।
3. DirectoryWalker এর অন্যান্য বৈশিষ্ট্য
- Recursion Depth: DirectoryWalker রিকার্সিভভাবে ফাইল ও ডিরেক্টরি ট্রাভার্স করার জন্য গভীরতা ট্র্যাক করে।
- Custom File Filters: আপনি কাস্টম ফাইল ফিল্টার তৈরি করতে পারেন যা নির্দিষ্ট শর্ত অনুযায়ী ফাইল ও ডিরেক্টরি নির্বাচন করে।
- Handling Symlinks: লিঙ্কগুলির জন্য বিশেষ হ্যান্ডলিং যোগ করা যেতে পারে যাতে সেগুলি প্রক্রিয়াজাত করা যায়।
সারাংশ
- DirectoryWalker ক্লাসটি Apache Commons IO লাইব্রেরির একটি শক্তিশালী বৈশিষ্ট্য, যা directory traversal এর জন্য ব্যবহৃত হয়।
- DirectoryWalker ব্যবহার করে আপনি একটি ডিরেক্টরি এবং তার ভিতরের সকল ফাইল এবং সাব-ডিরেক্টরি রিকার্সিভভাবে ট্রাভার্স করতে পারেন।
- handleFile() এবং handleDirectory() মেথডের মাধ্যমে আপনি ফাইল এবং ডিরেক্টরি প্রক্রিয়া করতে পারেন।
- কাস্টম ফিল্টার, রিকার্সন, এবং ডিরেক্টরি ট্রাভার্সাল এর জন্য DirectoryWalker খুবই উপকারী।
Apache Commons IO এর DirectoryWalker ক্লাস ডিরেক্টরি এবং ফাইলের সাথে কাজ করার সময় আরও আধুনিক এবং কার্যকরী পদ্ধতি সরবরাহ করে, যা কোডকে আরও পরিষ্কার এবং রক্ষণাবেক্ষণের জন্য সহজ করে তোলে।
Read more