Java 递归删除导致堆栈溢出错误

Java 递归删除导致堆栈溢出错误,java,delete-file,Java,Delete File,我问了一个关于如何从目录中的文件夹中删除所有文件但保留文件夹的问题,可以在此处找到: 其中一个目的是使用递归来实现这一点: public void DeleteFiles() { File file = new File( "D:/Documents/NetBeansProjects/printing~subversion/fileupload/web/"+ "resources/pdf/"); System.out.prin

我问了一个关于如何从目录中的文件夹中删除所有文件但保留文件夹的问题,可以在此处找到:

其中一个目的是使用递归来实现这一点:

public void DeleteFiles() {
    File file =
       new File(
          "D:/Documents/NetBeansProjects/printing~subversion/fileupload/web/"+
          "resources/pdf/");
    System.out.println("Called deleteFiles");
    if (file.isDirectory()) {
        for (File f : file.listFiles()) {
            DeleteFiles();
        }
    } else {
        file.delete();
    }
}
然而,我只是得到了一个控制台称为deleteFiles,直到我得到堆栈溢出错误,它似乎没有通过目录找到文件并删除它们,我如何才能做到这一点

 File file = new File("D:/Documents/NetBeansProjects/printing~subversion/fileupload/web/resources/pdf/");
您正在一次又一次地创建同一个文件。在函数外部声明该文件

您的递归与建议的不同

public void DeleteFiles( File file) {
    System.out.println("Called deleteFiles");
    if (file.isDirectory()) {
        for (File f : file.listFiles()) {
            DeleteFiles(f);
        }
    } else {
        file.delete();
    }
}
您正在一次又一次地创建同一个文件。在函数外部声明该文件

您的递归与建议的不同

public void DeleteFiles( File file) {
    System.out.println("Called deleteFiles");
    if (file.isDirectory()) {
        for (File f : file.listFiles()) {
            DeleteFiles(f);
        }
    } else {
        file.delete();
    }
}

当有更简单的解决方案时,递归就是自找麻烦。与:

或与:


当有更简单的解决方案时,递归就是自找麻烦。与:

或与:


你的递归显然是错误的,你应该拿一些纸,写下你的逻辑,这可能会对你有所帮助如果你看一下这个问题的原始答案,其中使用了递归,它有一个论点,你的递归显然是错误的,你应该拿一些纸,写下你的逻辑,如果你看看这个问题的原始答案,它使用了递归,它有一个参数,那么这可能会对你有所帮助。在很多情况下,递归是最简单的实现方式。您的方法需要包含一个外部库,并使用Recursiontoo@Andre:1 JDK7不是外部库。2在绝大多数Java开发中,添加库来完成某些任务是解决问题的首选方法,因为它消除了代码的复杂性,如上所述。3我上面的代码都不是递归的,这就是重点:我的代码更简单,因为实现是由一个可靠的库提供的,我不必关心这个实现。org.apache.commons绝对是一个外部库,请查看OracleJDK1.7API,2。并非在所有情况下都有效,例如,如果您的资源有限,Android、J2ME、许可证问题或需要定制3。再说一次:org.apache.commons.io.FileUtils确实使用递归参见@Andre:I给出了两个选项。一个是库,另一个是JDK 7。JDK 7不是一个外部库。commons io版本更简单,但请随意选择。而在封面下是如何做到的并不是重点。显然,OP在编写递归方法时遇到了问题。我的解决方案不需要他/她这样做。这是这里的重要部分。我从来没有说过,您的JDK 7解决方案依赖于一个外部库——然而,另一个肯定依赖。此外,您应该考虑到,并非所有环境都支持JDK 7,例如Android或许多仍然依赖1.6或更早版本的产品。从这个角度来看,你的解决方案可能不合适这正是关键:我们所做的就是提出建议!这取决于发布问题的用户来决定他喜欢什么,他是想深入研究库还是递归。你不应该因为个人喜好而贬低基本范式。Thxrecursion在许多情况下是最简单的实现方式。您的方法需要包含一个外部库,并使用Recursiontoo@Andre:1 JDK7不是外部库。2在绝大多数Java开发中,添加库来完成某些任务是解决问题的首选方法,因为它消除了代码的复杂性,如上所述。3我上面的代码都不是递归的,这就是重点:我的代码更简单,因为实现是由一个可靠的库提供的,我不必关心这个实现。org.apache.commons绝对是一个外部库,请查看OracleJDK1.7API,2。并非在所有情况下都有效,例如,如果您的资源有限,Android、J2ME、许可证问题或需要定制3。再说一次:org.apache.commons.io.FileUtils确实使用递归参见@Andre:I给出了两个选项。一个是库,另一个是JDK 7。JDK 7不是一个外部库。commons io版本更简单,但请随意选择。而在封面下是如何做到的并不是重点。显然,OP在编写递归方法时遇到了问题。我的解决方案不需要他/她这样做。这是这里的重要部分。我从来没有说过,您的JDK 7解决方案依赖于一个外部库——然而,另一个肯定依赖。此外,您应该考虑到,并非所有环境都支持JDK 7,例如Android或许多仍然依赖1.6或更早版本的产品。从这个角度来看,你的解决方案可能不合适这正是关键:我们所做的就是提出建议!这取决于发布问题的用户来决定他喜欢什么,他是想深入研究库还是递归。你 不要因为个人喜好而贬低基本范式。谢谢
import java.io.File;
import org.apache.commons.io.FileUtils;
import static org.apache.commons.io.filefilter.TrueFileFilter.TRUE;

File root = new File("D:/Documents/NetBeansProjects/printing~subversion/fileupload/web/resources/pdf/");
Iterator<File> files = FileUtils.iterateFiles(root, TRUE, TRUE);
for (File file : files) {
    file.delete();
}
import java.nio.file.*;
import java.nio.file.attribute.BasicFileAttributes;

Path root = Paths.get("D:/Documents/NetBeansProjects/printing~subversion/fileupload/web/resources/pdf/");
Files.walkFileTree(root, new SimpleFileVisitor<Path>() {
    @Override
    public FileVisitResult visitFile(Path file, BasicFileAttributes attrs)
            throws IOException {
        file.delete();
        return FileVisitResult.CONTINUE;
    }
})