Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/list/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 列出文件夹和文件_Java_List_File_Directory - Fatal编程技术网

Java 列出文件夹和文件

Java 列出文件夹和文件,java,list,file,directory,Java,List,File,Directory,我将此代码用于列出所有文件夹 public static void main(String[] args) throws Exception { File root = new File("C:\\Users\\resti\\Desktop\\example"); if (!root.isDirectory()) { System.out.println("some_text"); } int level = 0;

我将此代码用于列出所有文件夹

    public static void main(String[] args) throws Exception {
    File root = new File("C:\\Users\\resti\\Desktop\\example");
    if (!root.isDirectory())
    {
        System.out.println("some_text");
    }

    int level = 0;
        System.out.println(renderFolder(root, level, new StringBuilder(), false, new ArrayList<>()));

        }
    private static StringBuilder renderFolder(File folder, int level, StringBuilder sb, boolean isLast, List<Boolean> hierarchyTree) {
    indent(sb, level, isLast, hierarchyTree).append(folder.getName()).append("\n");

    File[] objects = folder.listFiles(new FilenameFilter() {
        @Override
        public boolean accept(File current, String name) {
            return new File(current, name).isDirectory();
        }
    });

    for (int i = 0; i < objects.length; i++) {
        boolean last = ((i + 1) == objects.length);

        // this means if the current folder will still need to print subfolders at this level, if yes, then we need to continue print |
        hierarchyTree.add(i != objects.length - 1);
        renderFolder(objects[i], level + 1, sb, last, hierarchyTree);

        // pop the last value as we return from a lower level to a higher level
        hierarchyTree.remove(hierarchyTree.size() - 1);
    }
    return sb;
}


private static StringBuilder indent(StringBuilder sb, int level, boolean isLast, List<Boolean> hierarchyTree) {
    String indentContent = "\u2502   ";
    for (int i = 0; i < hierarchyTree.size() - 1; ++i) {
        // determines if we need to print | at this level to show the tree structure
        // i.e. if this folder has a sibling foler that is going to be printed later
        if (hierarchyTree.get(i)) {
            sb.append(indentContent);
        } else {
            sb.append("    "); // otherwise print empty space
        }
    }

    if (level > 0) {
        sb.append(isLast
                ? "\u2514\u2500\u2500"
                : "\u251c\u2500\u2500");
    }

    return sb;
}
}
我可以重做这个方法吗?或者其他什么方法??
此代码不是我的

假设我理解您的问题,这是我的答案:

在给定的代码中:

File[] objects = folder.listFiles(new FilenameFilter() {
        @Override
        public boolean accept(File current, String name) {
            return new File(current, name).isDirectory();
        }
);
您正在筛选文件夹中找到的所有文件,并检查给定文件是否为.isDirectory目录。因此,生成的数组只包含文件夹

如果需要文件夹和文件,只需删除过滤器,即可将所有文件/文件夹保存在给定文件夹中

File[] objects = folder.listFiles();
因为代码现在还必须处理文件,所以我们必须对处理缩进的代码稍加修改

在更改文件和文件夹之前,代码对objects数组中的每个元素的作用都是相同的。但现在我们需要区分文件夹和文件

因此:

在我的测试文件夹中进行测试,结果如下:

└──62476474
    ├──target
    │   ├──generated-sources
    │   │   └──annotations
    │   ├──classes
    │   │   ├──Main.class
    │   └──maven-status
    │       └──maven-compiler-plugin
    │           └──compile
    │               └──default-compile
    │                   └──inputFiles.lst
    │                   └──createdFiles.lst
    └──pom.xml
    └──src
        ├──test
        │   └──java
        └──main
            └──java
                └──Main.java
这是我的文件夹结构的精确表示

这会解决你的问题。

试试这个

try {
    String[] command = { "/bin/sh", "-c", "cd /var; ls -l" };
    System.out.println("shell script command:");
    Stream.of(command).forEach(e -> System.out.println(e));
    Process process = Runtime.getRuntime().exec(command);
    StringBuilder stringBuilder = new StringBuilder();
    BufferedReader reader = new BufferedReader(
            new InputStreamReader(process.getInputStream()));

    String line = null;
    while ((line = reader.readLine()) != null) {
        System.out.println(line);
    }
} catch (Exception e) {
    System.out.println("Error while executing: " + e);
}
您可以删除FilenameFilter并仅使用它。它将返回目录中包含的所有文件和目录,如果对非目录文件调用,则返回null,因此在继续之前检查null非常重要。renderFolder的重写可以是:

private static StringBuilder renderFolder(File folder, int level, StringBuilder sb, boolean isLast, List<Boolean> hierarchyTree) {
        indent(sb, level, isLast, hierarchyTree).append(folder.getName()).append("\n");

        File[] objects = folder.listFiles();

        if (objects == null)
                // not a directory, there is nothing to iterate over, return immediately 
                return sb;

        for (int i = 0; i < objects.length; i++) {
                boolean last = ((i + 1) == objects.length);

                // this means if the current folder will still need to print subfolders at this level, if yes, then we need to continue print |
                hierarchyTree.add(i != objects.length - 1);
                renderFolder(objects[i], level + 1, sb, last, hierarchyTree);

                // pop the last value as we return from a lower level to a higher level
                hierarchyTree.remove(hierarchyTree.size() - 1);
        }
        return sb;
}

如果文件夹层次结构非常大,那么与通过递归函数反复调用File.list或File.listFiles相比,NIO Files.walkFileTree调用在生成目录树中所有文件的名称时要快得多

但是,您需要将代码的逻辑更改为FileVisitor的各种回调,这样就不值得付出努力,除非您的速度太慢。见:

Files.walkFileTree(dir, EnumSet.noneOf(FileVisitOption.class), Integer.MAX_VALUE, visitor);

/bin/sh,-c,cd/var;ls-l永远不会在Windows上工作,我认为调用这样的外部程序在这里确实是一种错误的方法
└──62476474
    ├──target
    │   ├──generated-sources
    │   │   └──annotations
    │   ├──classes
    │   │   ├──Main.class
    │   └──maven-status
    │       └──maven-compiler-plugin
    │           └──compile
    │               └──default-compile
    │                   └──inputFiles.lst
    │                   └──createdFiles.lst
    └──pom.xml
    └──src
        ├──test
        │   └──java
        └──main
            └──java
                └──Main.java
try {
    String[] command = { "/bin/sh", "-c", "cd /var; ls -l" };
    System.out.println("shell script command:");
    Stream.of(command).forEach(e -> System.out.println(e));
    Process process = Runtime.getRuntime().exec(command);
    StringBuilder stringBuilder = new StringBuilder();
    BufferedReader reader = new BufferedReader(
            new InputStreamReader(process.getInputStream()));

    String line = null;
    while ((line = reader.readLine()) != null) {
        System.out.println(line);
    }
} catch (Exception e) {
    System.out.println("Error while executing: " + e);
}
private static StringBuilder renderFolder(File folder, int level, StringBuilder sb, boolean isLast, List<Boolean> hierarchyTree) {
        indent(sb, level, isLast, hierarchyTree).append(folder.getName()).append("\n");

        File[] objects = folder.listFiles();

        if (objects == null)
                // not a directory, there is nothing to iterate over, return immediately 
                return sb;

        for (int i = 0; i < objects.length; i++) {
                boolean last = ((i + 1) == objects.length);

                // this means if the current folder will still need to print subfolders at this level, if yes, then we need to continue print |
                hierarchyTree.add(i != objects.length - 1);
                renderFolder(objects[i], level + 1, sb, last, hierarchyTree);

                // pop the last value as we return from a lower level to a higher level
                hierarchyTree.remove(hierarchyTree.size() - 1);
        }
        return sb;
}
Files.walkFileTree(dir, EnumSet.noneOf(FileVisitOption.class), Integer.MAX_VALUE, visitor);
Files.walkFileTree(dir, visitor);