精华内容
下载资源
问答
  • 多级目录结构
    千次阅读
    2018-10-24 09:46:27


    Java解压缩zip文件工具类(支持zip文件夹下多级目录结构)

    1. 前言

    由于工作需要一个能够解压缩zip的工具类,但查看了不少博客,发现查看的文章里都只支持zip文件夹下的一级文件结构,但实际生活中,zip文件夹下存在多级目录及文件是很随意的事情,所以萌生了封装这样一个能够解压缩多级目录结构文件的想法。

    2. 正文

    2.1 解压缩后文件目录结构展示

    在这里插入图片描述

    2.2 注意事项

    • 若zip文件中包含中文的话,可能需要制定字符编码,若不指定的话,默认使用UTF8字符编码
    • Windows系统压缩编码一般为GBKGB2312UTF8Linux系统压缩编码一般为UTF8
    • 测试数据使用GB2312能够正常解码,使用其它均不能正常解码

    2.3 异常

    2.3.1 可能会遇到的异常
    java.lang.IllegalArgumentException: MALFORMED
    	at java.util.zip.ZipCoder.toString(ZipCoder.java:58)
    	at java.util.zip.ZipFile.getZipEntry(ZipFile.java:583)
    	at java.util.zip.ZipFile.access$900(ZipFile.java:60)
    	at java.util.zip.ZipFile$ZipEntryIterator.next(ZipFile.java:539)
    	at java.util.zip.ZipFile$ZipEntryIterator.nextElement(ZipFile.java:514)
    	at java.util.zip.ZipFile$ZipEntryIterator.nextElement(ZipFile.java:495)
    	at com.tdt.sc.utils.FileUtils.unpack(FileUtils.java:91)
    	at com.tdt.sc.utils.FileUtils.unpack(FileUtils.java:54)
    	at com.tdt.sc.utils.FileUtils.unpack(FileUtils.java:34)
    	at com.tdt.sc.utils.FileUtils.main(FileUtils.java:23)
    
    2.3.2 解决方案
    • 此异常为字符编码解码异常
    • 建议使用其它字符编码进行解码,具体参见 注意事项

    2.4 具体代码实现

    import java.io.*;
    import java.nio.charset.Charset;
    import java.util.Enumeration;
    import java.util.zip.ZipEntry;
    import java.util.zip.ZipFile;
    
    /**
     * @program: 
     * @description: 文件解压缩工具类
     * @author: Mr.superbeyone
     * @create: 2018-10-23 14:04
     **/
    public class FileUtils {
    
        /**
         *  此方法将默认设置解压缩后文件的保存路径为zip文件所在路径
         *      即解压缩到当前文件夹下
         * @param zip zip文件位置
         * @param charsetName 字符编码
         */
        public static void unpack(String zip, String charsetName) {
            unpack(new File(zip), charsetName);
        }
    
        /**
         *
         * @param zip zip文件位置
         * @param outputDir 解压缩后文件保存路径
         * @param charsetName 字符编码
         */
        public static void unpack(String zip, String outputDir, String charsetName) {
            unpack(new File(zip), new File(outputDir), charsetName);
        }
    
        /**
         *  此方法将默认设置解压缩后文件的保存路径为zip文件所在路径
         *      即解压缩到当前文件夹
         * @param zip zip文件位置
         * @param charsetName 字符编码
         */
        public static void unpack(File zip, String charsetName) {
            unpack(zip, null, charsetName);
        }
    
        /**
         *
         * @param zip zip文件位置
         * @param outputDir 解压缩后文件保存路径
         */
        public static void unpack(File zip, File outputDir) {
            unpack(zip, outputDir, "");
        }
    
        /**
         *
         * @param zip zip文件位置
         * @param outputDir 解压缩后文件保存路径
         * @param charsetName 字符编码
         */
        public static void unpack(File zip, File outputDir, String charsetName) {
    
            FileOutputStream out = null;
            InputStream in = null;
            //读出文件数据
            ZipFile zipFileData = null;
            ZipFile zipFile = null;
            try {
                //若目标保存文件位置不存在
                if (outputDir != null) if (!outputDir.exists()) {
                    outputDir.mkdirs();
                }
                if (charsetName != null && charsetName != "") {
                    zipFile = new ZipFile(zip.getPath(), Charset.forName(charsetName));
                } else {
                    zipFile = new ZipFile(zip.getPath(), Charset.forName("utf8"));
                }
                //zipFile = new ZipFile(zip.getPath(), Charset.forName(charsetName));
                Enumeration<? extends ZipEntry> entries = zipFile.entries();
                //处理创建文件夹
                while (entries.hasMoreElements()) {
                    ZipEntry entry = entries.nextElement();
                    String filePath = "";
    
                    if (outputDir == null) {
                        filePath = zip.getParentFile().getPath() + File.separator + entry.getName();
                    } else {
                        filePath = outputDir.getPath() + File.separator + entry.getName();
                    }
                    File file = new File(filePath);
                    File parentFile = file.getParentFile();
                    if (!parentFile.exists()) {
                        parentFile.mkdirs();
                    }
                    if (parentFile.isDirectory()) {
                        continue;
                    }
                }
                if (charsetName != null && charsetName != "") {
                    zipFileData = new ZipFile(zip.getPath(), Charset.forName(charsetName));
                } else {
                    zipFileData = new ZipFile(zip.getPath(), Charset.forName("utf8"));
                }
                Enumeration<? extends ZipEntry> entriesData = zipFileData.entries();
                while (entriesData.hasMoreElements()) {
                    ZipEntry entry = entriesData.nextElement();
                    in = zipFile.getInputStream(entry);
                    String filePath = "";
                    if (outputDir == null) {
                        filePath = zip.getParentFile().getPath() + File.separator + entry.getName();
                    } else {
                        filePath = outputDir.getPath() + File.separator + entry.getName();
                    }
                    File file = new File(filePath);
                    if (file.isDirectory()) {
                        continue;
                    }
                    out = new FileOutputStream(filePath);
                    int len = -1;
                    byte[] bytes = new byte[1024];
                    while ((len = in.read(bytes)) != -1) {
                        out.write(bytes, 0, len);
                    }
                    out.flush();
                }
    
            } catch (Exception e) {
                e.printStackTrace();
            } finally {
                try {
                    out.close();
                    in.close();
                    zipFile.close();
                    zipFileData.close();
                } catch (IOException e) {
                    e.printStackTrace();
                }
            }
        }
    }
    

    2.4 遗留问题

    以下问题未做处理:

    1. 压缩文件内可能包含其它压缩文件
    2. 压缩文件内若存在空文件夹,则该文件夹会被当成文件处理,即生成以该文件夹名命名的空文件

    扩展:

    • 使用第三方 jar 实现解压,解决中文乱码问题
    <dependency>
    	<groupId>org.apache.commons</groupId>
    	<artifactId>commons-compress</artifactId>
    	<version>1.8.1</version>
    </dependency>
    
    public static void unpack(File zipFile, File descDir) {
        try (ZipArchiveInputStream inputStream = getZipFile(zipFile)) {
            if (!descDir.exists()) {
                descDir.mkdirs();
            }
            ZipArchiveEntry entry = null;
            while ((entry = inputStream.getNextZipEntry()) != null) {
                if (entry.isDirectory()) {
                    File directory = new File(descDir, entry.getName());
                    directory.mkdirs();
                } else {
                    OutputStream os = null;
                    try {
                        os = new BufferedOutputStream(new FileOutputStream(new File(descDir, entry.getName())));
                        //输出文件路径信息
                        System.out.println("解压文件的当前路径为:" + descDir + entry.getName());
                        IOUtils.copy(inputStream, os);
                    } finally {
                        IOUtils.closeQuietly(os);
                    }
                }
            }
    
        } catch (Exception e) {
            e.printStackTrace();
        }
    }
    
    private static ZipArchiveInputStream getZipFile(File zipFile) throws Exception {
        return new ZipArchiveInputStream(new BufferedInputStream(new FileInputStream(zipFile)));
    }
    
    更多相关内容
  • vue2.5,多页应用,多级目录结构,可灵活配置的static/common.js,webpack3
  • 3、文件目录思维导图文件控制块FCB目录操作目录结构单级目录结构两级目录结构多级目录结构(树形目录结构)无环图目录结构索引结点(FCB的改进) 思维导图 文件控制块FCB 1、什么是文件目录:一种特殊的文件,是有...

    思维导图

    在这里插入图片描述

    文件控制块FCB

    在这里插入图片描述

    1、什么是文件目录:一种特殊的文件,是有结构的文件,如上图的表格,用于记录各个文件的属性;最主要的属性是:文件名和物理地址的映射,从而实现按名存取
    2、什么是FCB:当你建立一个目录或者文件时,会在文件目录中新增一条记录(记录文件的属性),这样的一条记录就称做一个FCB。
    3、FCB中最重要的就是文件名和物理地址的映射,从而实现按名存取

    目录操作

    在这里插入图片描述

    目录结构

    单级目录结构

    在这里插入图片描述

    问题:不适用于多用户操作系统

    两级目录结构

    在这里插入图片描述

    问题:用户对自己的文件不能进行分类

    多级目录结构(树形目录结构)

    在这里插入图片描述

    1、多级目录结构:现在大部分操作系统使用的目录结构。
    2、绝对路径:由于目录结构分层,所以需要用一个路径来确定文件存放位置,从根开始的路径称为绝对路径
    3、相对路径:由于对每一层目录而言,需要将其调入内存后才可以对下一层目录进行读取;但是外存与内存之间的访问效率很低,所以,提出了相对路径,即从当前目录进行下级目录的查询(不需要在从根开始访问了),因为减少了I/O读写次数,所以文件访问速率就提升了。
    4、问题:树形目录结构可以很方便地对文件进行分类,层次结构清晰,也能够更有效地进行文件的管理和保护。但是,树形结构不便于实现文件的共享。为此,提出了“无环图目录结构”。

    无环图目录结构

    在这里插入图片描述

    1、无环图目录:可以用不同文件名指向同一个文件。
    2、由于一个文件有多个指向,所以,当删除文件时不能直接将文件本身删除。为此,设置了一个共享计数器,某个用户删除文件时,共享计数器减一,删除该用户的FCB,而不会对文件本身操作。

    索引结点(FCB的改进)

    在这里插入图片描述

    j本质上就是将目录文件压缩,用更少的磁盘块存储更多的文件目录项;由于内存调入磁盘块非常耗时,因此提高了文件检索速率,如上图示例。

    展开全文
  • 课程设计的环境是Linux 操作系统。 设计时可利用Linux 提供的文件管理的功能调用,建立一个模拟的文件系统。基本思想是,在Linux 系统中创建一个较大容量的文件,作为所设计的文件系统的“文件卷”,并利用Linux ...
  • gulp 打包多级目录结构

    千次阅读 2019-05-16 00:18:49
    打包前目录结构 2.打包后目录结构 原理分析:https://blog.csdn.net/qq_39582021/article/details/90240256 0. gulpfile.js 代码 , 执行代码前最好 clear 一下 命令行工具 1. 打包前目录结构: ...

    这一篇三部分组成: 0. gulpfile.js 代码 1. 打包前目录结构   2.打包后目录结构

    原理分析: https://blog.csdn.net/qq_39582021/article/details/90240256

    0. gulpfile.js 代码 , 执行代码前最好 clear 一下 命令行工具

    1. 打包目录结构:

     

    2. 打包后 release 目录结构: 

     

    后期如果想到更好的解决方案 , 再补上 , 如果有那位大神能够解决 , 欢迎指教!

     

    展开全文
  • yapi多级目录版本.zip

    2021-10-24 01:57:04
    yapi支持多级目录包,下载之前先安装mongodb,然后修改config配置,再进入vendors 输入 npm run install-serve 初始化数据,最后运行node server/app.js 启动即可 详情参考: https://github.com/zybieku/yapi
  • <link rel="stylesheet" type="text/... 这是一款带日志多级目录树型结构菜单js代码,可以动态添加和删除树节点,可以制作多级结构,每个节点上可以都带有右键上下文菜单,并且每个节点上都可以配置不同的图标。
  • 这是一款带日志多级目录树型结构菜单js代码,可以动态添加和树节点,可以制作多级结构,每个节点上可以都带有右键上下文菜单,并且每个节点上都可以配置不同的图标。
  • 多级目录树型结构菜单js代码
  • 文件目录结构:单级、两级、多级(树形)和无环图目录结构 与文件管理系统和文件集合相关联的是文件目录,它包含有关文件的信息,包括属性、 位置和所有权等,这些信息主要是由操作系统进行管理。首先我们来看目录...

    文件目录结构:单级、两级、多级(树形)和无环图目录结构

    与文件管理系统和文件集合相关联的是文件目录,它包含有关文件的信息,包括属性、 位置和所有权等,这些信息主要是由操作系统进行管理。首先我们来看目录管理的基本要求: 从用户的角度看,目录在用户(应用程序)所需要的文件名和文件之间提供一种映射,所以目录管理要实现“按名存取”;目录存取的效率直接影响到系统的性能,所以要提高对目录的检索速度;在共享系统中,目录还需要提供用于控制访问文件的信息。此外,文件允许重名也是用户的合理和必然要求,目录管理通过树形结构来解决和实现。

    文件控制块和索引结点

    同进程管理一样,为实现目录管理,操作系统中引入了文件控制块的数据结构。

    1) 文件控制块。

    文件控制块(FCB)是用来存放控制文件需要的各种信息的数据结构,以实现“按名存取”。FCB的有序集合称为文件目录,一个FCB就是一个文件目录项。为了创建一个新文件,系统将分配一个FCB并存放在文件目录中,成为目录项。

    FCB主要包含以下信息:

    • 基本信息,如文件名、文件的物理位置、文件的逻辑结构、文件的物理结构等。
    • 存取控制信息,如文件存取权限等。
    • 使用信息,如文件建立时间、修改时间等。

    2) 索引结点。

    在检索目录文件的过程中,只用到了文件名,仅当找到一个目录项(查找文件名与目录项中文件名匹配)时,才需要从该目录项中读出该文件的物理地址。也就是说,在检索目录时,文件的其他描述信息不会用到,也不需调入内存。因此,有的系统(如UNIX,见表)釆用了文件名和文件描述信息分开的方法,文件描述信息单独形成一个称为索引结点的数据结构,简称为 i 结点。在文件目录中的每个目录项仅由文件名和指向该文件所对应的i结点的指针构成。
     

    UNIX的文件目录结构
    文件名索引结点编号
    文件名1 
    文件名2 
      
      


    一个FCB的大小是64字节,盘块大小是1KB,则在每个盘块中可以存放16个FCB(注意,FCB必须连续存放)。而在UNIX系统中一个目录项仅占16字节,其中14字节是文件名,2字节是 i 结点指针。在1KB的盘块中可存放64个目录项。这样,可使查找文件时平均启动磁盘次数减少到原来的1/4,大大节省了系统开销。

    存放在磁盘上的索引结点称为磁盘索引结点,UNIX中的每个文件都有一个唯一的磁盘索引结点,主要包括以下几个方面:

    • 文件主标识符,拥有该文件的个人或小组的标识符。
    • 文件类型,包括普通文件、目录文件或特别文件。
    • 文件存取权限,各类用户对该文件的存取权限。
    • 文件物理地址,每个索引结点中含有13个地址项,即 iaddr(0) ~ iaddr(12),它们以直接或间接方式给出数据文件所在盘块的编号。
    • 文件长度,以字节为单位。
    • 文件链接计数,在本文件系统中所有指向该文件的文件名的指针计数。
    • 文件存取时间,本文件最近被进程存取的时间、最近被修改的时间以及索引结点最‘ 近被修改的时间。
    • 文件被打开时,磁盘索引结点复制到内存的索引结点中,以便于使用。在内存索引结点中又增加了以下内容:
    • 索引结点编号,用于标识内存索引结点。
    • 状态,指示i结点是否上锁或被修改。
    • 访问计数,每当有一进程要访问此i结点时,计数加1,访问结束减1。
    • 逻辑设备号,文件所属文件系统的逻辑设备号。
    • 链接指针,设置分别指向空闲链表和散列队列的指针。

    在理解一个文件系统的需求前,我们首先来考虑在目录这个层次上所需要执行的操作,这有助于后面文件系统的整体理解。

    • 搜索:当用户使用一个文件时,需要搜索目录,以找到该文件的对应目录项。
    • 创建文件:当创建一个新文件时,需要在目录中增加一个目录项。
    • 删除文件:当删除一个文件时,需要在目录中删除相应的目录项。
    • 显示目录:用户可以请求显示目录的内容,如显示该用户目录中的所有文件及属性。
    • 修改目录:某些文件属性保存在目录中,因而这些属性的变化需要改变相应的目录项。


    操作时,考虑以下几种目录结构:

    1) 单级目录结构。

    在整个文件系统中只建立一张目录表,每个文件占一个目录项,如图所示。

    当访问一个文件时,先按文件名在该目录中查找到相应的FCB,经合法性检查后执行相应的操作。当建立一个新文件时,必须先检索所有目录项以确保没有“重名”的情况,然后在该目录中增设一项,把FCB的全部信息保存在该项中。当删除一个文件时,先从该目录中找到该文件的目录项,回收该文件所占用的存储空间,然后再清除该目录项。

    单级目录结构实现了 “按名存取”,但是存在查找速度慢、文件不允许重名、不便于文件共享等缺点,而且对于多用户的操作系统显然是不适用的。

    2) 两级目录结构。

    单级目录很容易造成文件名称的混淆,可以考虑釆用两级方案,将文件目录分成主文件目录(Master File Directory, MFD)和用户文件目录(User File Directory, UFD)两级,如图所示。

    主文件目录项记录用户名及相应用户文件目录所在的存储位置。用户文件目录项记录该用户文件的FCB信息。当某用户欲对其文件进行访问时,只需搜索该用户对应的UFD,这既解决了不同用户文件的“重名”问题,也在一定程度上保证了文件的安全。

    两级目录结构可以解决多用户之间的文件重名问题,文件系统可以在目录上实现访问限制。但是两级目录结构缺乏灵活性,不能对文件分类。

    3) 多级目录结构(树形目录结构)。

    将两级目录结构的层次关系加以推广,就形成了多级目录结构,即树形目录结构,如图所示。

    用户要访问某个文件时用文件的路径名标识文件,文件路径名是个字符串,由从根目录出发到所找文件的通路上的所有目录名与数据文件名用分隔符链接起来而成。从根目录出发的路径称绝对路径。当层次较多时,每次从根目录查询浪费时间,于是加入了当前目录,进程对各文件的访问都是相对于当前目录进行的。当用户要访问某个文件时,使用相对路径标识文件,相对路径由从当前目录出发到所找文件通路上所有目录名与数据文件名用分隔符“/”链接而成。

    上图是Linux操作系统的目录结构,“/dev/hda”就是一个绝对路径。若当前目录为 “/bin”,则“./ls”就是一个相对路径,其中.符号表示当前工作目录。

    通常,每个用户都有各自的“当前目录”,登录后自动进入该用户的“当前目录”。操作系统提供一条专门的系统调用,供用户随时改变“当前目录”。例如,UNIX系统中, “/etc/passwd”文件就包含有用户登录时默认的“当前目录”,可用cd命令改变“当前目录”。

    树形目录结构可以很方便地对文件进行分类,层次结构清晰,也能够更有效地进行文件的管理和保护。但是,在树形目录中查找一个文件,需要按路径名逐级访问中间结点,这就增加了磁盘访问次数,无疑将影响查询速度。

    4) 无环图目录结构。

    树形目录结构可便于实现文件分类,但不便于实现文件共享,为此在树形目录结构的基础上增加了一些指向同一结点的有向边,使整个目录成为一个有向无环图。引入无环图目录结构是为了实现文件共享,如图4-6所示。

    当某用户要求删除一个共享结点时,若系统只是简单地将它删除,当另一共享用户需要访问时,却无法找到这个文件而发生错误。为此可以为每个共享结点设置一个共享计数器,每当图中增加对该结点的共享链时,计数器加 1;每当某用户提出删除该结点时,计数器减1。仅当共享计数器为0时,才真正删除该结点,否则仅删除请求用户的共享链。
     


    图4-6  图形目录结构


    共享文件(或目录)不同于文件拷贝(副本)。如果有两个文件拷贝,每个程序员看到的是拷贝而不是原件;但如果一个文件被修改,那么另一个程序员的拷贝不会有改变。对于共享文件,只存在一个真正文件,任何改变都会为其他用户所见。

    无环图目录结构方便实现了文件的共享,但使得系统的管理变得更加复杂。

     

    展开全文
  • 多级目录结构的Makefile(详细注释) 本文主要以例程的方式展示了二级目录结构下的Makefile的写法(详细注释);对于更加纷杂的多级目录,大家可在此基础上进行修改 #定义变量 #ARCH默认为x86,使用gcc编译器,否则...
  • 带日志JS多级目录结构特效是一款可以动态添加和删除树节点,可以制作多级结构,每个节点上可以都带有右键上下文菜单,并且每个节点上都可以配置不同的图标。
  • python实现一次创建多级目录的方法

    千次阅读 2020-12-11 02:15:29
    python实现一次创建多级目录的方法本文实例讲述了python实现一次创建多级目录的方法。分享给大家供大家参考。具体实现方法如下:import osos.makedirs( "/home/jb51/data" )这样就可以创建一个三级目录。希望本文所...
  • java构造多级结构,支持多根节点. 运行main即可看到效果
  • JS 创建多级目录

    2020-07-03 19:07:26
    } 使用递归的方式创建多级目录 let fs = require('fs') let path = require('path') var tempPath = "D:/temp/temp1/temp2/temp3/temp.txt"; function mkdirsSync(dirname) { if (fs.existsSync(dirname)) { return...
  • php创建多级目录代码

    2020-12-18 02:42:53
    function ...//在当前目录下创建2007/3/4的目录结构. 您可能感兴趣的文章:PHP创建多级目录的两种方法php创建多级目录的方法php循环创建目录示例分享(php创建多级目录)php创建多级目录完整封装类操作方法
  • 一、文件的逻辑结构 类似于数据结构的“逻辑结构”和“物理结构”。 ①、如“线性表”就是一种逻辑结构,在用户角度看来,线性表就是一组有先后关系的元素序列,如:a,b, c, d, e …… ②、“线性表”这种逻辑结构...
  • 多级目录结构的软件,一般是单个程序、库文件或模块放在各自的目录中。automake要求每个目录都有自己的Makefile.am文件来编译各自目录 下的代码。在顶级的目录中,有一个Makefile.am文件,该文件通过SUBDIRS指明了这...
  • 主要介绍了Python实现多级目录压缩与解压文件的方法,涉及Python针对文件路径的遍历、判断以及文件压缩、解压缩等相关操作技巧,需要的朋友可以参考下
  • 内容索引:VB源码,系统相关,目录 VB根据目录结构创建多级文件夹,一个FSO小程序,不过觉得挺实用的,虽然程序功能不多,只要你输入 一定的目录结构,程序会分析路径并自动创建一级一级的目录,类似操作在WEB编程中是...
  • TreeNode多级目录显示

    2018-05-24 17:14:11
    TreeNode ,左侧面板显示三级目录, int sublen = taskht.Keys.Count;//三级目录长度 int len = webht.Keys.Count; //二级目录长度 System.Windows.Forms.TreeNode treeRootNode = new System.Windows.Forms....
  • 本课程设计要求设计一个模拟的多用户多级目录的文件系统。通过具体的文件存储空间的管理、文件的物理结构目录结构和文件操作的实现,加深对文件系统内部功能和实现过程的理解。 二、课程设计的要求与数据 1. 在...
  • (4) 文件目录结构采用多用户多级目录结构,每个目录项包含文件名、物理地址、长度等信息,还可以通过目录项实现对文件的读和写的保护。目录组织方式可以不使用索引结点的方式,但使用索引结点,则难度系数为1.2。 (5...
  • 4.文件目录结构采用多用户多级目录结构,每个目录项包含文件名、物理地址、长度等信息,还可以通过目录项实现对文件的读和写的保护。目录组织方式可以不使用索引结点的方式,但使用索引结点,则难度系数为1.2。 5....
  • 菜单树形结构,支持三级、多级树形结构代码,纯手写代码,简单易懂,适合各个阶段试用,支持jquery调用。
  • aimaraJS是一款非常实用的纯javascript响应式多级目录结构插件。该目录树可以动态添加和删除树节点,可以制作多级结构,每个节点上可以都带有右键上下文菜单,并且每个节点上都可以配置不同的图标。
  • NULL 博文链接:https://canlynet.iteye.com/blog/2364136
  • 将有多层目录文件,压缩形成多层目录结构的压缩包,或将多层目录的文件压缩省单目录结构的压缩包
  • 下载照片到本地文件夹(可做临时缓存文件,最后删除),分类存放照片,压缩成zip下载到指定路径(保留or不保留多级目录结构)。 【压缩成zip通过response返回自定义下载路径可参考:,两者异曲同工】 需要熟悉的类的...
  • 多级树形结构实现

    2021-04-03 03:57:00
    多级树形结构实现,该项目对android多级树形的一个实现 并在代码中一 一分析了并注释关键地方;可以通过点击右侧箭头进行缩放,在选中勾选框时,其节点下的子节点也会随着其选中而勾选,具体如图所示,希望能够帮到...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 94,314
精华内容 37,725
关键字:

多级目录结构

友情链接: 333.zip