使用java递归深度优先遍历文件系统
我需要用java遍历一个随机文件系统(windows) 问题是:它需要自下而上,因为我将数据合并在一起,根目录应该包含我的所有数据集 这就是我到目前为止的情况:使用java递归深度优先遍历文件系统,java,recursion,filesystems,Java,Recursion,Filesystems,我需要用java遍历一个随机文件系统(windows) 问题是:它需要自下而上,因为我将数据合并在一起,根目录应该包含我的所有数据集 这就是我到目前为止的情况: private void listDir(File dir) { File[] files = dir.listFiles(); if (files != null) { for (int i = 0; i < files.length; i++) { System.out.
private void listDir(File dir) {
File[] files = dir.listFiles();
if (files != null) {
for (int i = 0; i < files.length; i++) {
System.out.print(files[i].getAbsolutePath());
if (files[i].isDirectory()) {
System.out.print(" (Directory)\n");
listDir(files[i]); //Recursion
}
else {
System.out.print(" (File)\n");
}
}
}
}
private void listDir(文件目录){
File[]files=dir.listFiles();
如果(文件!=null){
对于(int i=0;i
那么,有没有办法实现这一点
非常感谢您的帮助,希望我的问题不会打扰您^ ^对于每个目录,您可以先处理子目录,然后处理目录中的文件
private void listDir(File dir) {
File[] files = dir.listFiles();
if (files != null) {
for (int i = 0; i < files.length; i++) { // Directories
if (files[i].isDirectory()) {
System.out.print(" (Directory)\n");
listDir(files[i]); //Recursion
}
}
for (int i = 0; i < files.length; i++) { // Files
if (!files[i].isDirectory()) {
System.out.print(" (File)\n");
}
}
}
}
private void listDir(文件目录){
File[]files=dir.listFiles();
如果(文件!=null){
对于(inti=0;i
也许你想要这样的东西:
private int countFiles(File dir) {
int res = 0;
if (files != null) {
for (int i = 0; i < files.length; i++) { // Files
if (!files[i].isDirectory()) {
System.out.print(" (File)\n");
res++;
}
}
}
return res;
}
private int countFilesDeep(File dir) {
File[] files = dir.listFiles();
int res = 0;
if (files != null) {
for (int i = 0; i < files.length; i++) { // Directories
if (files[i].isDirectory()) {
System.out.print(" (Directory)\n");
res += countFilesDeep(files[i]); //Recursion
}
}
}
res += countFiles(dir);
return res;
}
private int countFiles(文件目录){
int res=0;
如果(文件!=null){
对于(int i=0;i
通常,使用深度优先树递归,您可以通过更改输出语句和递归调用的顺序来影响输出的顺序
以这棵树为例:
1
/ \
2 3
/ \ \
4 5 6
如果我的代码是(此答案中的所有代码都是伪代码):
。。。然后它将输出1 2 4 5 3 6
——按照您头脑中的逻辑,验证这是真的
如果我只更改语句的顺序:
void f(Node node) {
if(node == null) return;
f(node.left);
print node.value;
f(node.right);
}
现在它将打印4 2 5 1 3 6
——再次按照逻辑进行操作并验证其正确性
void f(Node node) {
if(node == null) return;
f(node.left);
f(node.right);
print node.value;
}
。。。打印4 5 2 6 3 1
——这可能是您想要的
您可能需要一个广度优先遍历,并且您可能希望颠倒输出的顺序-Google中有一些示例
在一个文件系统中,子文件的数量不仅仅是左和右,所以它更像:
void recursiveList(File f) { // f could be a file or a directory
if(f is a file) {
output file info about f
return
}
// else it's a directory
for(File entry : f.getChildren()) {
recursiveList(entry);
}
output directory info about f
}
所以我写了这个:
public void walkFilesystem(File f)
{
File[] arr= f.listFiles();
if(arr.length>0) //-> against nullPointer
{
for(File file : arr)
{
if(file.isDirectory())
{
System.out.println(file.getAbsolutePath()+" (Directory)");
walkFilesystem(file);
}
else if(file.isFile()&&file.getPath().contains("txt"))
{
System.out.println(file.getAbsolutePath()+" (node)");
}
}
}
}
那应该有用,不是吗 你应该能够使用一个。在方法中进行合并。你必须更具体地说明“自下而上行走”对你意味着什么。你是在看反向深度优先合并,还是宽度优先?给出一个树上的例子..这正是我想要的,所以它是深度优先树递归非常好的回答,我将用java编写代码,明天在这里分享。感谢您的时间和知识(slim:),但我如何知道文件系统中哪个节点在左侧,哪个节点在右侧?按字母顺序比较?按listFiles()的顺序?我添加了一些相关内容。@malle这正是我在推荐中链接的方法所做的。这不是答案。然而,最好的方法是运行它,如果你给它传递一个目录,就会抛出一个nullPointerException,因为arr是空的。如果知道该文件是目录,则只需调用listFiles()。嗯,它不会抛出空指针。。。我的意思是,我是否能理解它:if(arr.length>0)?我明白它为什么有效了:你永远不会传递一个非目录。if(arr.length>0)将抛出NPE,因为它将尝试计算
null.length
,如果您已经用希望它使用的每个输入场景对它进行了测试,并且它生成了您想要的输出,那么它就工作了。
public void walkFilesystem(File f)
{
File[] arr= f.listFiles();
if(arr.length>0) //-> against nullPointer
{
for(File file : arr)
{
if(file.isDirectory())
{
System.out.println(file.getAbsolutePath()+" (Directory)");
walkFilesystem(file);
}
else if(file.isFile()&&file.getPath().contains("txt"))
{
System.out.println(file.getAbsolutePath()+" (node)");
}
}
}
}