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);