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不是空的,带有打印语句,但文件内容是空的。无论如何,谢谢大家;如前所述,我可能会尝试一种新的文件访问者解决方案,看看效果如何。