我试图将下面打印语句中的所有字符串放入文件中。
我有一个递归方法来检查所有目录和子目录(我认为它是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
,所以最终在每个目录和每个子目录中都创建了一个文件 - 哎呀! 子>
答案 0 :(得分:1)
它留下了一个空白文件。
为避免这种情况,您可以使用此重载的构造函数启用自动刷新:
public PrintWriter(OutputStream out, boolean autoFlush)
或者您也可以在程序终止之前刷新编写器。
请注意,java.io.file.File
是用于处理文件的旧API
您应该使用java.io
API,它提供更可靠,简单和有效的方法来处理文件
@crizzis在评论中提到它,他/她是对的
但是你真的不需要为这样一个简单的案例创建FileVisitor
实现。
以下是依赖Path
和Files.walk()
的示例
处理由两个Stream函数执行:
这是一个完整的可执行代码(异常情况并未详尽处理。您必须根据您的要求以更完整的方式执行此操作):
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();
}
});
}
}
}