Gradle学习笔记之文件操作

news2024/11/19 1:36:46

文章目录

  • 本地文件
  • 文件集合
  • 文件树
  • 文件拷贝
  • 归档文件

Gradle中的文件操作方式有五种:本地文件、文件集合、文件树、文件拷贝和归档文件。

本地文件

比较简单,API跟java中的完全一致:

task("test_file") {
    doFirst {
        def f1 = file("../test.txt")
        if (!f1.exists()) {
            f1.createNewFile()
        }

        def f2 = file("D:/develop/ideaWorkspace/GradleTest/test2.txt")
        if (!f2.exists()) {
            f2.createNewFile()
        }

        def f3 = new File("src")
        println f3.absolutePath
    }
}

文件集合

Gradle中的文件集合用file()创建,既可以遍历,也支持+-+=-=运算符,也可以转换成SetList等集合:

task("test_file_collections") {
    doFirst {
        def file_cols = files( // 创建文件集合
                "../test1.txt",
                file("../test2.txt"),
                new File("../test3.txt"),
                ["../test4.txt", "../test5.txt"])

        file_cols.forEach({ // 遍历文件集合
            File file -> { 
                if (!file.exists()) {
                    file.createNewFile()
                }
                println file.absolutePath
            }
        })

        // 将文件集合转换成Set或List,并且遍历
        Set s1 = file_cols.files
        Set s2 = file_cols as Set

        List list = file_cols as List
        list.forEach({
            println it.name
        })

        // 文件集合的操作符操作
        file_cols += file("../test6.txt")
        file_cols -= file("../test1.txt")

        println "========================================"
        file_cols.forEach({
            if (it != null) {
                println it.absolutePath
            }
        })

    }
}

输出结果:

(base) PS D:\develop\ideaWorkspace\GradleTest\lib1> gradle test_file_collections

> Task :lib1:test_file_collections
D:\develop\ideaWorkspace\GradleTest\test1.txt
D:\develop\ideaWorkspace\GradleTest\test2.txt
D:\develop\ideaWorkspace\GradleTest\test3.txt
D:\develop\ideaWorkspace\GradleTest\test4.txt
D:\develop\ideaWorkspace\GradleTest\test5.txt
test1.txt
test2.txt
test3.txt
test4.txt
test5.txt
========================================
D:\develop\ideaWorkspace\GradleTest\test2.txt
D:\develop\ideaWorkspace\GradleTest\test3.txt
D:\develop\ideaWorkspace\GradleTest\test4.txt
D:\develop\ideaWorkspace\GradleTest\test5.txt
D:\develop\ideaWorkspace\GradleTest\test6.txt

BUILD SUCCESSFUL in 2s
1 actionable task: 1 executed

相关文件均可以被创建出来:
在这里插入图片描述

文件树

文件树继承自文件集合,通过fileTree()创建,用来遍历某目录下的所有文件(包括子目录及子目录中的文件),并且可以指定包含和过滤方法:

task "test_file_tree" {
    doFirst {
        def tree = fileTree("../").include("**/*.txt") // 方式1,使用路径创建文件树,通过include()/exclude()等方法设置过滤原则

        def tree2 = fileTree("../") { // 方式2,使用路径+闭包的形式创建文件树,过滤原则写在闭包中
            include "**/*.txt"
        }

        def tree3 = fileTree( // 方式3,使用参数映射的方式创建文件树
                dir: "../",
                includes: ["**/*.txt"], excludes: ["**/*1*", "**/*4*"])

        tree3.each({ // 遍历文件树中的文件
            File f -> {
                println f.absolutePath
            }
        })
    }
}

输出效果如下:

(base) PS D:\develop\ideaWorkspace\GradleTest\lib1> gradle test_file_tree

> Task :lib1:test_file_tree
D:\develop\ideaWorkspace\GradleTest\test.txt
D:\develop\ideaWorkspace\GradleTest\test2.txt
D:\develop\ideaWorkspace\GradleTest\test3.txt
D:\develop\ideaWorkspace\GradleTest\test5.txt

BUILD SUCCESSFUL in 2s
1 actionable task: 1 executed

文件拷贝

通过类型为Copy的函数实现:

task "CopyTask" (type: Copy) {
    from ("../src", "../test1.txt", zipTree("../test.zip"))
    into "../src_copied" // 目的目录不存在时,会自动创建
}

from参数为一个目录,则将目录下的所有内容(不包括目录本身)复制到目的目录;若from参数为一个文件,则复制文件本身;若from参数为一个zipTree压缩包,则将压缩包的内容复制到目的目录。任何需要复制的内容,如果在目的目录已经存在,则不会再一次复制。

我们也可以通过includeexcluderename等函数或闭包,实现复制文件的包含、排除和复制后的重命名:

task "CopyTask" (type: Copy) {
    from ("../src", "../test1.txt", zipTree("../test.zip"))
    into "../src_copied"

    // 包含
    include "**/*.txt"

    // 排除
    exclude {
        it.file.name.contains("3") || !it.file.name.endsWith(".txt")
    }

    // 复制后的重命名
    rename {String filename -> {
        filename.replace(".txt", ".txt.bak")
    }}
}

执行任务后的效果:
在这里插入图片描述
我们也可以在普通任务中使用copy闭包执行复制任务:

task "copy_2" {
    doFirst {
        copy {
            from ("../src", "../test1.txt", zipTree("../test.zip"))
            into "../src_copied"

            include "**/*.txt"
            exclude {
                it.file.name.contains("3") || !it.file.name.endsWith(".txt")
            }

            rename {String filename -> {
                filename.replace(".txt", ".txt.bak")
            }}
        }
    }
}

或者直接通过copy闭包执行复制任务:

task "copy_2" {
    doFirst {
        copy {
            from ("../src", "../test1.txt", zipTree("../test.zip"))
            into "../src_copied"

            include "**/*.txt"
            exclude {
                it.file.name.contains("3") || !it.file.name.endsWith(".txt")
            }

            rename {String filename -> {
                filename.replace(".txt", ".txt.bak")
            }}
        }
    }
}

而后,执行该项目的gradle build即可:
在这里插入图片描述

归档文件

以打zip包为例,gradle压缩文件是通过Zip闭包任务函数实现的:

task myZip (type: Zip) {
    from "../build" // 压缩的源目录
    destinationDir(file("../")) // 压缩完成后,压缩文件的保存目录
    baseName "build_s" // 压缩完成后,压缩文件名
}

println myZip.archiveName // 输出压缩文件名

输出效果如下:

(base) PS D:\develop\ideaWorkspace\GradleTest\lib1> gradle myZip

> Configure project :lib1
build_s.zip

Deprecated Gradle features were used in this build, making it incompatible with Gradle 8.0.

You can use '--warning-mode all' to show the individual deprecation warnings and determine if they come from your own script
s or plugins.

See https://docs.gradle.org/7.2/userguide/command_line_interface.html#sec:command_line_warnings

BUILD SUCCESSFUL in 2s
1 actionable task: 1 executed

同时可以在指定位置找到输出文件:
在这里插入图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/112702.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

史上最强,这份在各大平台获百万推荐的Java核心手册实至名归

又逢“金九银十”,年轻的毕业生们满怀希望与忐忑,去寻找、竞争一个工作机会。已经在职的开发同学,也想通过社会招聘或者内推的时机争取到更好的待遇、更大的平台。 然而,面试人群众多,技术市场却相对冷淡,…

再学C语言13:字符串(4)——scanf函数

一、scanf函数的使用 scanf函数功能:把输入的字符串转换成各种形式(整数、浮点数、字符、字符串) scanf函数是printf函数的逆操作 scanf函数与printf函数一样使用控制字符串和参数列表 控制字符串指出输入将被转换成的格式 主要区别在参…

Qt实现表格控件

一、概述 最近在研究QTableView支持多级表头的事情,百度了下网上资料还是挺多的。实现的方式总的来说有2种,效果都还不错,最主要是搞懂其中的原理,做到以不变应万变。 实现多级表头的方式有以下两种方案 行表头和列表头都是用一…

网络空间安全——利用 CVE-2017-0213 提权

利用 CVE-2017-0213 提权 VE-2017-0213 是一个比较冷门的COM 类型混淆 (Type Confusion)漏洞。巧妙的利用该漏洞,可以实现本地的提权。该漏洞由著名的Google Project zero 发现。 下面就简单演示一下利用CVE-2017-0213漏洞简单提权, 首先下载CVE-2017…

【环境搭建】RocketMQ集群搭建

前置条件及效果图 条件: 两台服务器,个人是两台腾讯云服务器(其中嫖的朋友一个); 版本: rocketmq-version:4.4.0rocketmq-console(mq控制台)Java:1.8maven:3.6.3 集群模式选择: 单master 这种方式风险…

【Django】第三课 基于Django超市订单管理系统开发

概念 本文在上一文之上,针对管理员,经理,普通员工身份的用户操作供应商管理模块功能。 功能实现 供应商管理模块属于业务功能,这里管理员不具备操作权限,而经理具备与供应商之间谈合作的实际需要,因此经…

Linux | 进程理解,fork | 进程地址空间

文章目录冯诺依曼体系结构的理解为什么要有内存的存在?操作系统的管理进程的理解系统调用接口进程的查看fork进程状态Linux进程具体的状态孤儿进程总结进程优先级怎样修改优先级?进程其他概念进程抢占进程地址空间利用代码验证地址区域验证堆区和栈区的增…

python3GUI--音乐播放器(精简版)By:PyQt5(附下载地址)

文章目录一.前言二.预览1.主界面2.歌单页3.歌词页4.播放列表5.mini6.设置三.心得1.解耦2.体验优化3.歌词显示四.总结一.前言 传送门: 1.python3GUI–打造一款音乐播放器By:PyQt5(附下载地址&am…

LD_PRELOAD劫持

在前面UUCTF的uploadinject题,遇到了 LD_PRELOAD劫持,之前没遇见过,刚好借此机会学一学。不能小瞧这个变量,它甚至可以弹shell,绕过disable_functions,非常危险。下面来介绍一下这个变量,以及怎…

XDocReport使用入门

XDocReport 简介 XDocReport是GitHub上根据麻省理工学院许可证开源的Wrod导出框架。XDocReport可以根据ODT、Doc、Docx文档模板通过模板引擎语法(Freemarker、Velocity)转换为另外一种格式文档(Doc、Docx、XHTML、PDF)。 XDocR…

防沉迷管理系统

开发工具(eclipse/idea/vscode等): 数据库(sqlite/mysql/sqlserver等): 功能模块(请用文字描述,至少200字): 1、用户模块 1.1注册:用户通过注册生产账号,并在数据库存储数据 1.2登录:用户登录后…

k8s学习-CKA真题-k8s升级(kubeadm、kubelet、kubectl等)

目录题目解析命令准备工作升级组件升级kubectl、kubelet收尾结果killer 模拟环境题目解析解题参考题目 解析 结合博主当前环境,调整后题目为: 现有的 Kubernetes 集权正在运行的版本是 1.23.6,仅将主节点上的所有 kubernetes 控制面板和组件…

【语音处理】基于加权压力匹配方法(WPMM)的声音系统研究(Matlab代码实现)

👨‍🎓个人主页:研学社的博客 💥💥💞💞欢迎来到本博客❤️❤️💥💥 🏆博主优势:🌞🌞🌞博客内容尽量做到思维缜…

【小程序】案例 - 本地生活(列表页面)

1. 演示页面效果以及主要功能 页面导航并传参 上拉触底时加载下一页数据 下拉刷新列表数据 2. 列表页面的 API 接口 以分页的形式,加载指定分类下商铺列表的数据: 接口地址 https://www.escook.cn/categories/:cate_id/shops URL 地址中的 :cate…

博泰应宜伦:智能汽车上攻时刻,需要“国家级”平台登场

作者 | 张祥威 编辑 | 王博汽车智能化转型的道路上,有个问题可能并非杞人忧天,而是值得整个行业警醒的。那就是: 中国的智能汽车发展,是否会被国外“卡脖子”? 卡脖子的担忧,其实也可以理解为,中…

【Linux】shell及其运行原理

目录1.什么是shell2.shell的功能3.shell的感性理解4.为什么不安装图形化界面1.什么是shell shell : 操作系统内核的外壳 通常来讲,计算机硬件是由运算器、控制器、存储器、输入/输出设备等硬件共同组成的,而让各种硬件设备各司其职且能协同运…

【基础强训】day3

一、选择题 &#x1f4a6;第1题&#xff1a; 以下程序的输出结果是&#xff08;&#xff09; #include <stdio.h> main() { char a[10] {1, 2, 3, 4, 5, 6, 7, 8, 9, 0}, *p; int i; i 8; p a i; printf("%s\n", p - 3); } A 6 B 6789 C 6 D 789 B 先定义…

阳了之后,python实用工具之:疫情信息快速查看

嗨害大家好鸭&#xff01;我是小熊猫&#xff01;&#xff08;阳了个阳版&#xff09; &#xff08;先给大家消消毒&#xff09; 不好意思&#xff0c;很久没给大家更新了… 主要是小熊猫我不小心阳了… 大家要多注意自己的身体健康 多喝点热水 这个真的是个好东西 在家里稍…

深度学习—00入门 神经网络 pytorch

1、深度学习简介 深度学习是机器学习的一个分支&#xff0c;简单来说就是通过人工神经网络&#xff0c;强行在业务的 输入 和 输出 之间&#xff0c;暴力耦合一个出一个数学模型。 1.1 深度学习特点 1、由于是暴力耦合出来的模型&#xff0c;自然模型可解释性很差&#xff0c…

STM32 cubeMX配置OLED

文章目录前言一、OLED的接线二、cubeMX的配置三、OLED的驱动代码四、OLED的使用总结前言 本篇文章主要介绍OLED的操作和使用。 一、OLED的接线 OLED一共有四根线这里我使用的是IIC的OLED显示屏。 VCC----3.3V或者5V GND-----GND SDA-----PB7 SCL-----PB6 二、cubeMX的配置 …