java - 查找所有文件夹和子文件夹内容并像结构一样显示(Java)

标签 java

我正在开发一个项目,需要我获取所有文件名和文件夹(子文件夹)名称。 我试图在我的第一种方法中使用名为 yo 的 ArrayList 来做到这一点。

从头开始的代码如下:

public ArrayList varToList(File folder) {

        for(File fileEntry : folder.listFiles()){
            if(fileEntry.isDirectory()){
                yo.add(fileEntry.getName());
                varToList(fileEntry);
            } else
                yo.add(fileEntry.getName());
        }
        return yo;
    }

从头开始执行代码后的输出:

[AddFilesDeflateComp.zip, AddFilesDeflateComp1.zip, AddFolder.zip, HAHAFolder, 200HAHA.txt, YO.txt, HAHAFolder.zip, RootText1.txt, RootText2.txt, RootText3.txt, test.zip, TestFolderA, TestFolderA1, text1.txt, Text2.txt, Text3.txt, TextA.txt, TextB.txt, TestFolderB, TestFolderC, TestFolder 4, boss.txt, New folder, play you.txt]

然后我改用另一种方法,因为上面的方法显然无法做到这一点。

这是获取文件结构的代码:

String folderName = "root";
ArrayList<String> folders = new ArrayList<String>();
ArrayList<String> files = new ArrayList<String>();
ArrayList<String> previousFiles = new ArrayList<String>();
Map<String, ArrayList> map2 = new LinkedHashMap<String, ArrayList>();
Map<String, ArrayList> map = new LinkedHashMap<String, ArrayList>();

public void listFilesForFolder(File folder) {
    ArrayList<String> no = new ArrayList<String>();
    files = new ArrayList<String>();
    for (File fileEntry : folder.listFiles()) {
        if (fileEntry.isDirectory()) {
            previousFiles = files;
            map2.put(folderName, previousFiles);
            folders.add(folderName);
            folderName = fileEntry.getName();
            listFilesForFolder(fileEntry);
            if (folders.size() - 1 != -1) {
                folderName = folders.get(folders.size() - 1);
                folders.remove(folders.get(folders.size() - 1));
                files = map2.get(folderName);

            }
        } else {
            files.add(fileEntry.getName());
            map.put(folderName, files);
        }
    }

}

最终 map 内容如下:

{root=[AddFilesDeflateComp.zip, AddFilesDeflateComp1.zip, AddFolder.zip, HAHAFolder.zip, RootText1.txt, RootText2.txt, RootText3.txt, test.zip], HAHAFolder=[200HAHA.txt, YO.txt], TestFolderA1=[text1.txt, Text2.txt, Text3.txt], TestFolderA=[TextA.txt, TextB.txt], TestFolder 4=[boss.txt, play you.txt]}

我的预期输出:

{root=[AddFilesDeflateComp.zip, AddFilesDeflateComp1.zip, AddFolder.zip, HAHAFolder.zip, RootText1.txt, RootText2.txt, RootText3.txt, test.zip],HAHAFolder=[200HAHA.txt, YO.txt],TestFolderA=[TextA.txt,TextB.txt,TestFolderA1=[text1.txt,Text2.txt,Text3.txt],TestFolderB=[TestFolderC=[TestFolder 4=[New folder,boss.txt,play you.txt]]]]}

上面的代码可以获取子文件夹的内容,并且可以获取文件夹的名称,但不能获取空的子文件夹或文件夹

执行上述代码时我的文件结构:

Root/
HAHAFolder
    /200HAHA.txt
    /Yo.txt
TestFolderA
    /TestFolderA1
        /text1.txt
        /Text2.txt
        /Text3.txt
    /TextA.txt
    /TextB.txt
TestFolderB
    /TestFolderC
        /TestFolder 4
            /New folder
            /boss.txt
            /play you.txt
AddFilesDeflateComp.zip
AddFilesDeflateComp1.zip
AddFolder.zip
HAHAFolder.zip
RootText1.txt
RootText2.txt
RootText3.txt
test.zip

是否还有其他方法或如何修改上述代码以获得我需要的内容

最佳答案

恕我直言,递归方法最适合文件系统的递归结构。

你的第一个方法还不错,你只需要一个 List 参数来添加你找到的项目:

public List<File> addToList(File item, List<File> list) {
     list.add(item);
     if (item.isDirectory()) {
        for(File fileEntry : item.listFiles())
            list = addToList(fileEntry, list);
     }
     return list;
}

你这样调用它:

  File topdir = ....;  
  List<File> all = addToList(topdir, new ArrayList<File>());

如果您只想打印目录结构:

public void printTree(File item, int depth) {
     for (i=0; i< depth; i++) System.out.print(" ");
     System.out.println (item);
     if (item.isDirectory()) {
        for(File fileEntry : item.listFiles())
            printTree(fileEntry, depth+2);
     }
}

关于java - 查找所有文件夹和子文件夹内容并像结构一样显示(Java),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19926809/

相关文章:

java - 在单独的线程中停止可运行的

java - OpenCV Java 计算照片中的对象

java - 如何在 Java 中初始化字节数组?

java - Guice - 如何提供一个 API,支持灵活的可插拔策略实现及其自己的绑定(bind)?

java - 如何更改 JTextField 的宽度和高度?

java - 如何使用 AWS CDK for Java 为账户创建 IAM 委托(delegate)人?

ubuntu - Ubuntu 上 swing 应用程序的系统菜单上不显示输入法菜单项

java - 蒙戈 : $type is not working in mongo find query

java - 静态变量的多个实例

java - Oracle JDBC Driver SetBigStringTryClob 属性是否仍然有效?