জাভাতে, আমি কীভাবে কেবল একটি ডিরেক্টরি থেকে সাব-ডাইরেক্টরিগুলি তালিকাবদ্ধ করব?
আমি java.io.File কার্যকারিতাটি ব্যবহার করতে চাই, এটি করার জন্য জাভা সেরা পদ্ধতি কোনটি?
জাভাতে, আমি কীভাবে কেবল একটি ডিরেক্টরি থেকে সাব-ডাইরেক্টরিগুলি তালিকাবদ্ধ করব?
আমি java.io.File কার্যকারিতাটি ব্যবহার করতে চাই, এটি করার জন্য জাভা সেরা পদ্ধতি কোনটি?
উত্তর:
ডিরেক্টরি তালিকাতে ফাইল ক্লাস ব্যবহার করতে পারেন ।
File file = new File("/path/to/directory");
String[] directories = file.list(new FilenameFilter() {
@Override
public boolean accept(File current, String name) {
return new File(current, name).isDirectory();
}
});
System.out.println(Arrays.toString(directories));
হালনাগাদ
এই পোস্টে লেখকের কাছ থেকে মন্তব্যটি একটি দ্রুততর উপায়, দুর্দান্ত আলোচনা এখানে চেয়েছিল: জাভাতে খুব সহজেই ডিরেক্টরিগুলির একটি তালিকা পুনরুদ্ধার করবেন কীভাবে?
মূলত:
একটি খুব সাধারণ জাভা 8 সমাধান:
File[] directories = new File("/your/path/").listFiles(File::isDirectory);
এটি ফাইলফিল্টার ব্যবহারের সমতুল্য (পুরানো জাভাতেও কাজ করে):
File[] directories = new File("/your/path/").listFiles(new FileFilter() {
@Override
public boolean accept(File file) {
return file.isDirectory();
}
});
::
এই উদাহরণে ডাবল কোলন কীভাবে কাজ করবে?
@ মোহাম্মদ মনসুর আপনি প্রায় সেখানেই ছিলেন ... আপনি যে "দির" যুক্তিটি ব্যবহার করছেন তা আসলে নিরাময় পথ, তাই এটি সর্বদা সত্য হবে। শিশুটি একটি উপ-ডিরেক্টরি বা না তা দেখার জন্য আপনাকে সেই শিশুটিকে পরীক্ষা করা দরকার।
File file = new File("/path/to/directory");
String[] directories = file.list(new FilenameFilter() {
@Override
public boolean accept(File current, String name) {
return new File(current, name).isDirectory();
}
});
System.out.println(Arrays.toString(directories));
আপনি যদি জাভা 7 এবং NIO.2 ব্যবহার করে কোনও সমাধানে আগ্রহী হন তবে এটি এরকম হতে পারে:
private static class DirectoriesFilter implements Filter<Path> {
@Override
public boolean accept(Path entry) throws IOException {
return Files.isDirectory(entry);
}
}
try (DirectoryStream<Path> ds = Files.newDirectoryStream(FileSystems.getDefault().getPath(root), new DirectoriesFilter())) {
for (Path p : ds) {
System.out.println(p.getFileName());
}
} catch (IOException e) {
e.printStackTrace();
}
ArrayList<File> directories = new ArrayList<File>(
Arrays.asList(
new File("your/path/").listFiles(File::isDirectory)
)
);
আমি java.io.File কার্যকারিতা ব্যবহার করতে চাই,
২০১২ সালে (প্রশ্নের তারিখ) হ্যাঁ, আজ নয়। java.nio
এ জাতীয় প্রয়োজনীয়তার জন্য এপিআইর পক্ষে যেতে হবে।
অনেক উত্তর দিয়ে ভয়ঙ্কর, তবে আমি যে সহজ উপায়টি ব্যবহার করব তা নয় Files.walk().filter().collect()
।
বিশ্বব্যাপী দুটি পদ্ধতি সম্ভব:
1) যখন Files.walk(Path start, )
কোন maxDepth
সীমাবদ্ধতা আছে
2) Files.walk(Path start, int maxDepth, FileVisitOption... options)
এটি সেট করার অনুমতি দেয়।
কোনও গভীরতার সীমাবদ্ধতা নির্দিষ্ট না করেই এটি দেবে:
Path directory = Paths.get("/foo/bar");
try {
List<Path> directories =
Files.walk(directory)
.filter(Files::isDirectory)
.collect(Collectors.toList());
} catch (IOException e) {
// process exception
}
এবং যদি উত্তরাধিকারগত কারণে, আপনার সংগ্রহের আগে File
একটি map(Path::toFile)
ক্রিয়াকলাপ যোগ করতে পারেন আপনার একটি তালিকা পাওয়া দরকার :
Path directory = Paths.get("/foo/bar");
try {
List<File> directories =
Files.walk(directory)
.filter(Files::isDirectory)
.map(Path::toFile)
.collect(Collectors.toList());
} catch (IOException e) {
// process exception
}
Files.list(Path)
সম্ভবত হিসাবে একই Files.walk(Path,1)
।
Files.list(Path)
একটি সঠিক বিকল্প যদি আমরা পুনরাবৃত্তভাবে ফোল্ডারগুলি পুনরাবৃত্তি করতে না চাই। পুনরাবৃত্তভাবে ফোল্ডার পুনরাবৃত্তি করতে, walk()
আরও ভাল ফিট করে।
যাঁরা জাভা 7 এবং এনআইও-তে আগ্রহী তাদের জন্য উপরে @ voo এর উত্তরের একটি বিকল্প সমাধান রয়েছে । আমরা একটি চেষ্টা-সহ-সংস্থানগুলি কল করতে পারি Files.find()
এবং একটি ল্যাম্বডা ফাংশন ব্যবহার করতে পারি যা ডিরেক্টরিগুলি ফিল্টার করতে ব্যবহৃত হয়।
import java.io.IOException;
import java.nio.file.Files;
import java.nio.file.Path;
import java.nio.file.Paths;
import java.util.stream.Stream;
final Path directory = Paths.get("/path/to/folder");
try (Stream<Path> paths = Files.find(directory, Integer.MAX_VALUE, (path, attributes) -> attributes.isDirectory())) {
paths.forEach(System.out::println);
} catch (IOException e) {
...
}
আমরা এমনকি ল্যাম্বদা ফাংশন পরিবর্তন করে নামগুলি দ্বারা ফিল্টার করতে পারি:
(path, attributes) -> attributes.isDirectory() && path.toString().contains("test")
বা তারিখ দ্বারা:
final long now = System.currentTimeMillis();
final long yesterday = new Date(now - 24 * 60 * 60 * 1000L).getTime();
// modified in the last 24 hours
(path, attributes) -> attributes.isDirectory() && attributes.lastModifiedTime().toMillis() > yesterday
আমার জন্য যে সমাধানটি কাজ করেছিল, সেগুলি উত্তরগুলির তালিকা থেকে নিখোঁজ। তাই আমি এই সমাধানটি এখানে পোস্ট করছি:
File[]dirs = new File("/mypath/mydir/").listFiles((FileFilter)FileFilterUtils.directoryFileFilter());
এখানে আমি org.apache.commons.io.filefilter.FileFilterUtils
অ্যাপাচি কমন্স- io-2.2.jar থেকে ব্যবহার করেছি। এর ডকুমেন্টেশনটি এখানে উপলভ্য: https://commons.apache.org/proper/commons-io/javadocs/api-2.2/org/apache/commons/io/filefilter/FileFilterUtils.html
একটি হিসাবে একটি সূচনা ডিরেক্টরি দেওয়া String
String
প্যারামিটার হিসাবে একটি পদক্ষেপ নেয় এমন একটি পদ্ধতি তৈরি করুন । পদ্ধতিতে:listFiles
পদ্ধতিটি ব্যবহার করে বর্তমান ডিরেক্টরিতে ফাইলগুলির একটি অ্যারে পানআমার কোডের সমাধান এখানে solution আমি প্রথম উত্তর থেকে একটি লিটল পরিবর্তন করেছি । এটি সমস্ত ফোল্ডারগুলিকে কেবল পছন্দসই ডিরেক্টরি লাইনে লাইন দ্বারা তালিকাবদ্ধ করবে:
try {
File file = new File("D:\\admir\\MyBookLibrary");
String[] directories = file.list(new FilenameFilter() {
@Override
public boolean accept(File current, String name) {
return new File(current, name).isDirectory();
}
});
for(int i = 0;i < directories.length;i++) {
if(directories[i] != null) {
System.out.println(Arrays.asList(directories[i]));
}
}
}catch(Exception e) {
System.err.println("Error!");
}
আপনি জাভা 7 ফাইল এপিআই ব্যবহার করতে পারেন
Path myDirectoryPath = Paths.get("path to my directory");
List<Path> subDirectories = Files.find(
myDirectoryPath ,
Integer.MAX_VALUE,
(filePath, fileAttr) -> fileAttr.isDirectory() && !filePath.equals(myDirectoryPath )
).collect(Collectors.toList());
আপনি যদি একটি নির্দিষ্ট মান চান তবে ডেটা সংগ্রহের আগে আপনি যে মানটি চান তা দিয়ে ম্যাপটিতে কল করতে পারেন।
File files = new File("src");
// src is folder name...
//This will return the list of the subDirectories
List<File> subDirectories = Arrays.stream(files.listFiles()).filter(File::isDirectory).collect(Collectors.toList());
// this will print all the sub directories
Arrays.stream(files.listFiles()).filter(File::isDirectory).forEach(System.out::println);
এটি আক্ষরিকভাবে সমস্ত উপ-ডিরেক্টরি তালিকাভুক্ত করবে (এটি মুদ্রণ করবে)। এটি মূলত এমন একটি লুপ যেখানে আপনার কোনও তালিকার মাঝে আইটেমগুলি সংরক্ষণ করার প্রয়োজন নেই। সম্ভবত এটির জন্য একটি প্রয়োজন, তাই আমি এটি এখানে রেখেছি।
Path directory = Paths.get("D:\\directory\\to\\list");
Files.walk(directory, 1).filter(entry -> !entry.equals(directory))
.filter(Files::isDirectory).forEach(subdirectory ->
{
// do whatever you want with the subdirectories
System.out.println(subdirectory.getFileName());
});