我正在尝试获取目录中所有文本文件的名称。如果目录有子目录,那么我也想在那些文件中获取任何文本文件。我不知道如何让任何数量的子目录继续进行。
现在,下面的代码只获取当前目录中的所有文本文件以及目录中的子目录。对于找到的每个子目录,它还会查找任何文本文件和更深层次的子目录。问题是如果那些更深层次的子目录还有更深层次的子目录,那么我找不到所有的文本文件。这似乎是一个需要递归的问题,因为我不知道这会有多深。
到目前为止,这是我的代码:
File rootDirectory = new File(rootDir);
if (rootDirectory.isDirectory()) {
System.out.println("Valid directory");
File[] listOfFiles = rootDirectory.listFiles();
for (int i = 0; i < listOfFiles.length; i++) {
String iName = listOfFiles[i].getName();
if (listOfFiles[i].isFile()) {
if (iName.endsWith(".txt") || iName.endsWith(".TXT")) {
System.out.println("File: "+iName);
}
}
if (listOfFiles[i].isDirectory()) {
System.out.println("Directory: "+iName);
File[] subList = listOfFiles[i].listFiles();
for (int j = 0; j < subList.length; j++) {
String jName = subList[j].getName();
if (subList[j].isFile()) {
if (jName.endsWith(".txt") || jName.endsWith(".TXT")) {
System.out.println("\tFile: "+jName);
}
}
if (subList[j].isDirectory()) {
System.out.println("\tDirectory: "+jName);
}
}
}
}
}
else System.out.println("Invalid directory");
编辑:搞定了,谢谢Olaf Dietsche:
public void findFiles(File root, int depth) {
File[] listOfFiles = root.listFiles();
for (int i = 0; i < listOfFiles.length; i++) {
String iName = listOfFiles[i].getName();
if (listOfFiles[i].isFile()) {
if (iName.endsWith(".txt") || iName.endsWith(".TXT")) {
for (int j = 0; j < depth; j++) System.out.print("\t");
System.out.println("File: "+iName);
}
}
else if (listOfFiles[i].isDirectory()) {
for (int j = 0; j < depth; j++) System.out.print("\t");
System.out.println("Directory: "+iName);
findFiles(listOfFiles[i], depth+1);
}
}
}
答案 0 :(得分:8)
public void find_files(File root)
{
File[] files = root.listFiles();
for (File file : files) {
if (file.isFile()) {
...
} else if (file.isDirectory()) {
find_files(file);
}
}
}
答案 1 :(得分:2)
使用java 7的java.nio.file功能。我实现了类似的func。并加入了一些测试。
在我的电脑上搜索.txt时的基准
"c:/" "c:/windows"
file.io 36272ms 14082ms
file.nio 7167ms 2987ms
在javadoc中阅读更多内容,它是非常强大的API
java.nio.file.filevisitor javadoc
public static void main(String[] args) {
long starttime = System.currentTimeMillis();
try {
Path startPath = Paths.get("c:/");
Files.walkFileTree(startPath, new SimpleFileVisitor<Path>() {
@Override
public FileVisitResult preVisitDirectory(Path dir,
BasicFileAttributes attrs) {
System.out.println("Dir: " + dir.toString());
return FileVisitResult.CONTINUE;
}
@Override
public FileVisitResult visitFile(Path file, BasicFileAttributes attrs) {
if (file.toString().endsWith(".txt")){
System.out.println(file.toString());
}
return FileVisitResult.CONTINUE;
}
@Override
public FileVisitResult visitFileFailed(Path file, IOException e) {
return FileVisitResult.CONTINUE;
}
});
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
long completetime = System.currentTimeMillis() - starttime;
System.out.println("totaltime=" + completetime);
}
答案 2 :(得分:1)
答案在于您的问题的标签。使用递归。递归包括自己调用方法。
在这种情况下,该方法应该直接在给定目录下打印所有文本文件,并为目录的每个子目录调用自身。