以递归方式写入文件

时间:2018-01-19 15:55:17

标签: java file-io

我试图将下面打印语句中的所有字符串放入文件中。

我有一个递归方法来检查所有目录和子目录(我认为它是here我从中获取代码。)

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

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是每个目录,所以没有好处。

所以我尝试将System.out...替换为PrintWriter *(writer.println(file.toString());)的文件,但它留下了一个空的输出文件。

我认为这是因为我最初没有关闭writer但是因为递归而我似乎无所谓。我试着追加到StringBuilder(+一个新行),然后将其添加到一个文件中,但又一次只留下一个空白文件。

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

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

1 个答案:

答案 0 :(得分:1)

  

它留下了一个空白文件。

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

public PrintWriter(OutputStream out, boolean autoFlush) 

或者您也可以在程序终止之前刷新编写器。

请注意,java.io.file.File是用于处理文件的旧API 您应该使用java.io API,它提供更可靠,简单和有效的方法来处理文件 @crizzis在评论中提到它,他/她是对的 但是你真的不需要为这样一个简单的案例创建FileVisitor实现。

以下是依赖PathFiles.walk()的示例 处理由两个Stream函数执行:

  • 过滤空目录(中间操作)
  • 每个
  • :在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();
                     }
                 });
        }
    }
}