我需要使用java浏览随机文件系统(windows)。
问题:它需要自下而上,因为我将数据合并在一起,根应该包含我的所有数据集。
到目前为止我所拥有的:
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");
}
}
}
}
那么任何想法如何实现呢?
我感谢任何帮助,希望我不会因为我的问题而烦恼你^^
答案 0 :(得分:1)
通常,使用深度优先树递归,您可以通过更改输出语句和递归调用的顺序来影响输出的顺序。
拿这棵树:
1
/ \
2 3
/ \ \
4 5 6
如果我的代码说(此答案中的所有代码都是伪代码):
void f(Node node) {
if(node == null) return;
print node.value;
f(node.left);
f(node.right);
}
...然后输出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
}
答案 1 :(得分:0)
您可以为每个目录首先处理子目录,然后处理目录中的文件。
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 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;
}
答案 2 :(得分:0)
所以我写了这个:
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)");
}
}
}
}
应该不应该工作吗?