如何在Java中扫描文件夹?
答
不知道要如何表示的树?无论如何,这里是一个使用递归扫描整个子树的例子。文件和目录被视为一样。请注意,File.listFiles()对于非目录返回null。
public static void main(String[] args) {
Collection<File> all = new ArrayList<File>();
addTree(new File("."), all);
System.out.println(all);
}
static void addTree(File file, Collection<File> all) {
File[] children = file.listFiles();
if (children != null) {
for (File child : children) {
all.add(child);
addTree(child, all);
}
}
}
Java 7提供了一些改进。例如,DirectoryStream一次提供了一个结果 - 调用者不再需要等待所有I/O操作才能完成。这允许增量GUI更新,提前取消等。
static void addTree(Path directory, Collection<Path> all)
throws IOException {
try (DirectoryStream<Path> ds = Files.newDirectoryStream(directory)) {
for (Path child : ds) {
all.add(child);
if (Files.isDirectory(child)) {
addTree(child, all);
}
}
}
}
请注意,可怕的null返回值已被IOException取代。
的Java 7还提供了一个tree walker:
static void addTree(Path directory, final Collection<Path> all)
throws IOException {
Files.walkFileTree(directory, new SimpleFileVisitor<Path>() {
@Override
public FileVisitResult visitFile(Path file, BasicFileAttributes attrs)
throws IOException {
all.add(file);
return FileVisitResult.CONTINUE;
}
});
}
答
import java.io.File;
public class Test {
public static void main(String [] args) {
File actual = new File(".");
for(File f : actual.listFiles()){
System.out.println(f.getName());
}
}
}
它显示不清楚的文件和文件夹。
见文件类的方法对它们进行排序或避免目录打印等
答
退房阿帕奇共享文件实用程序(listFiles,iterateFiles等)。不错的便利方法可以做你想做的事情,也可以使用过滤器。
http://commons.apache.org/io/api-1.4/org/apache/commons/io/FileUtils.html
答
在JDK7,“更NIO的功能”应该有方法在文件树应用访问者模式或只是一个目录的即时内容 - 无需在遍历它们之前,查找潜在巨大目录中的所有文件。
答
您也可以使用FileFilter
界面来筛选出你想要的。
import java.io.File;
import java.io.FileFilter;
public class ListFiles {
public File[] findDirectories(File root) {
return root.listFiles(new FileFilter() {
public boolean accept(File f) {
return f.isDirectory();
}});
}
public File[] findFiles(File root) {
return root.listFiles(new FileFilter() {
public boolean accept(File f) {
return f.isFile();
}});
}
}
答
可视化的树形结构对我来说是最方便的方法:
public static void main(String[] args) throws IOException {
printTree(0, new File("START/FROM/DIR"));
}
static void printTree(int depth, File file) throws IOException {
StringBuilder indent = new StringBuilder();
String name = file.getName();
for (int i = 0; i < depth; i++) {
indent.append(".");
}
//Pretty print for directories
if (file.isDirectory()) {
System.out.println(indent.toString() + "|");
if(isPrintName(name)){
System.out.println(indent.toString() + "*" + file.getName() + "*");
}
}
//Print file name
else if(isPrintName(name)) {
System.out.println(indent.toString() + file.getName());
}
//Recurse children
if (file.isDirectory()) {
File[] files = file.listFiles();
for (int i = 0; i < files.length; i++){
printTree(depth + 4, files[i]);
}
}
}
//Exclude some file names
static boolean isPrintName(String name){
if (name.charAt(0) == '.') {
return false;
}
if (name.contains("svn")) {
return false;
}
//.
//. Some more exclusions
//.
return true;
}
答
public static void directory (File dir) {
File[] files = dir.listFiles();
for (File file : files) {
System.out.println(file.getAbsolutePath());
if (file.listFiles() != null)
directory(file);
}
}
这里dir是要扫描目录,当你创建一个实现它的匿名类,最好使用。例如c:\
TREE是什么意思?如果您正在寻找一种方法来列出文件夹中的所有文件(递归),请更改您的问题。 – 2012-05-08 10:10:21
@PeterPerháč这个问题是4岁.. :)谢谢 – Lipis 2012-05-08 11:58:31