代码之家  ›  专栏  ›  技术社区  ›  achAmháin

以递归方法写入文件

  •  0
  • achAmháin  · 技术社区  · 7 年前

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

    我有一个递归方法来检查所有目录和子目录(我认为是这样的 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()); )

    我最初在 字符打印流 在递归方法中,最终在每个目录和每个子目录中创建了一个文件-哎呀!

    1 回复  |  直到 7 年前
        1
  •  1
  •   davidxxx    7 年前

    它留下了一个空白文件。

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

    public PrintWriter(OutputStream out, boolean autoFlush) 
    

    也可以在程序终止之前刷新写入程序。

    请注意 java.io.file.File 是一个用于操作文件的旧API。
    您应该使用 java.io API,它提供了更可靠、简单和高效的方式来操作文件。
    @克里兹在评论中提到了这一点,他/她是对的。
    但你真的不需要 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();
                         }
                     });
            }
        }
    }