Java 用递归方法写入文件

Java 用递归方法写入文件,java,file-io,Java,File Io,我正在尝试将下面打印语句中的所有字符串放入一个文件中 我有一个递归方法来检查所有目录和子目录,我想这是我从中获取代码的地方 然后基本上检查目录是否为空,如果为空,则打印目录名: File directory = new File(directoryName); List<File> resultList = new ArrayList<>(); File[] fList = directory.listFiles(); resultList.addAll(Arrays.a

我正在尝试将下面打印语句中的所有字符串放入一个文件中

我有一个递归方法来检查所有目录和子目录,我想这是我从中获取代码的地方

然后基本上检查目录是否为空,如果为空,则打印目录名:

File directory = new File(directoryName);
List<File> resultList = new ArrayList<>();
File[] fList = directory.listFiles();
resultList.addAll(Arrays.asList(fList));
for (File file : fList) {
    if (file.isDirectory()) {
        if (file.list().length == 0) {
            System.out.println(file.toString());
        }
        resultList.addAll(listf(file.getAbsolutePath()));
    }
}
return resultList;
显然,resultList是每个目录,所以这不好

所以我试着更换了系统,结果。。。使用PrintWriter*writer.printlnfile.toString创建文件;但它留下了一个空的输出文件


我认为这是因为我最初没有关闭writer,但我在哪里做这件事似乎无关紧要,因为递归。我尝试在StringBuilder+上添加一行新行,然后一次性添加到文件中,但还是留下了一个空白文件

所以基本上,我的问题是:如何将嵌套if中的每个条目添加到文本文件中,即System.out.printlnfile.toString的输出

我最初是用递归方法初始化PrintWriter的,所以最终在每个目录和每个子目录中创建了一个文件-哎呀

它留下了一个空白文件

为了避免这种情况,可以使用此重载构造函数启用自动刷新:

public PrintWriter(OutputStream out, boolean autoFlush) 
也可以在程序终止前刷新写入程序

请注意,java.io.file.file是一个用于操作文件的旧API。 您应该使用java.ioAPI,它提供了更可靠、简单和高效的方式来操作文件。 @克里兹在评论中提到了这一点,他/她是对的。 但对于这样一个简单的情况,您实际上不需要创建FileVisitor实现

下面是一个依赖Path和Files.walk的示例。 处理由两个流函数执行:

筛选空目录中介操作 for each:在writer终端操作中打印目录路径 下面是一个完整的可执行代码,异常情况不会被彻底处理。您必须根据自己的要求以更完整的方式完成:

import java.io.BufferedOutputStream;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.PrintWriter;
import java.nio.file.Files;
import java.nio.file.Paths;

public class WriterForEmptyDirectory {

    public static void main(String[] args) throws IOException {
        try (PrintWriter writer = new PrintWriter(new BufferedOutputStream(new FileOutputStream("result")), true)) {

            String directoryPath = "a-path-to-analyse";
            Files.walk(Paths.get(directoryPath))
                 .filter(f -> {
                     try {
                         return Files.isDirectory(f) && Files.list(f)
                                                             .count() == 0;
                     } catch (IOException e) {
                         System.err.println("Error to handle for file " + f);
                         e.printStackTrace();
                         return false;
                     }
                 })
                 .forEach(f -> {
                     try {
                         writer.println(f);
                     } catch (Exception e) {
                         System.err.println("Error to handle for file " + f);
                         e.printStackTrace();
                     }
                 });
        }
    }
}

结果列表是每个目录,所以这不好。-一定要这样吗?你为什么不收集空目录呢?你提到的问题已经有四年了。帮你自己一个忙,使用一个文件访问者:我尝试在StringBuilder+上添加一行新行,然后一次添加到一个文件,但还是留下了一个空白文件。-你检查过StringBuilder的内容了吗?如果它不是空的,你的问题不是递归,而是如何写入文件-你没有显示。是的-我想收集和返回空目录会有用-我会在以后有机会的时候尝试一下。是的,我认为这是一个旧版本,因为它在我的机器上已经有一段时间了,所以我只是为了我的目的稍微修改了一下;我要看看最新的软件。而且,StringBuilder不是空的,带有打印语句,但文件内容是空的。无论如何,谢谢大家;如前所述,我可能会尝试一种新的文件访问者解决方案,看看效果如何。