Gradle 进阶学习之 文件操作

server/2024/9/20 7:26:47/ 标签: 学习, java, gradle

1、本地文件

在 Gradle 中,Project.file(java.lang.Object) 方法是一个非常有用的工具,它允许你以一种类型安全的方式引用文件。这个方法可以接收一个字符串路径,返回一个 File 对象,这个对象代表的是一个相对于当前项目目录(或者子项目目录)的文件或目录,或者是指定的绝对路径。

1.1 使用 Project.file 方法

以下是如何使用 Project.file 方法的示例:

// 使用相对路径引用文件
File configFile = file('src/conf.xml')
if (!configFile.exists()) {configFile.createNewFile() // 创建文件
}// 使用绝对路径引用文件
configFile = file('C:\\code\\java\\gradle-01\\conf.xml')
if (!configFile.exists()) {println(configFile.createNewFile()) // 创建文件并打印结果
}// 使用一个已有的 File 对象
File anotherConfigFile = new File('src/config.xml')
println(anotherConfigFile.exists()) // 打印文件是否存在

image-20240420173809382

1.2 相对路径和绝对路径

  • 相对路径:当你使用相对路径时,Gradle 会将其解释为相对于当前项目的根目录(或子项目的根目录)的路径。例如,'src/conf.xml' 会指向当前项目根目录下的 src 子目录中的 conf.xml 文件。

  • 绝对路径:绝对路径直接指向文件系统中的特定位置,不依赖于项目的目录结构。例如,'D:\\conf.xml' 指向 D 盘根目录下的 conf.xml 文件。

1.3 File 对象的操作

使用 Project.file 方法创建的 File 对象是 Java 中的 java.io.File 对象的一个实例。你可以使用它执行各种文件操作,比如检查文件是否存在、创建新文件、读取和写入文件内容等。

1.4 注意事项

  • 当使用 createNewFile() 方法创建新文件时,如果文件已经存在,该方法将返回 false,并且不会覆盖现有文件。
  • 文件操作可能会因权限问题而失败,确保你的应用程序有足够的权限来执行这些操作。
  • 在实际的构建脚本中,通常建议使用 Gradle 提供的专门针对文件操作的任务类型,如 CopyDelete 等,因为它们提供了更好的构建缓存支持和错误处理。

1.5 总结

Project.file 方法是 Gradle 中处理文件和目录的便捷方式,它结合了 Groovy 的简洁性和 Java File 类的功能,使得文件操作更加直观和易于管理。

2、文件集合

在 Gradle 中,FileCollection 接口代表一组文件,这个接口提供了多种方法来操作这组文件。你可以通过 Project.files 方法来创建一个 FileCollection 实例,该方法接受多个参数,包括字符串路径、File 对象数组或集合等。

2.1 创建 FileCollection

以下是如何使用 Project.files 方法创建 FileCollection 实例的示例:

def collection = files('src/test1.txt', new File('src/test2.txt'), ['src/test3.txt', 'src/test4.txt'])

在这个例子中,我们创建了一个包含多个不同类型文件引用的 FileCollection 对象。

2.2 操作 FileCollection

  • 创建文件:使用 forEach 遍历集合,并使用 createNewFile() 方法创建每个文件。
collection.forEach { File it ->it.createNewFile()println it.name // 输出文件名
}

image-20240420180132419

  • 转换类型FileCollection 可以被转换为 Java 的 SetList 类型。
Set set1 = collection.files // 把文件集合转换为 java 中的 Set 类型
Set set2 = collection as Set
List list = collection as List // 把文件集合转换为 java 中的 List 类型
  • 遍历 List:可以遍历转换后的 List 并执行操作。
for (item in list) {println item.name // 输出每个文件的名称
}

image-20240420180215227

  • 集合操作:可以使用 + 来添加一个文件集合,或者使用 - 来从一个集合中删除文件。
def union = collection + files('src/test5.txt') // 添加一个文件到集合
def minus = collection - files('src/test3.txt') // 从集合中删除一个文件
  • 遍历新的集合:可以遍历修改后的集合。
union.forEach { File it ->println it.name // 输出添加到集合的每个文件的名称
}

image-20240420180650636

2.3 总结

Gradle 的 FileCollection 提供了一种灵活的方式来处理一组文件。你可以创建文件、遍历、转换集合、以及执行集合间的添加和删除操作。这些功能在编写构建脚本时非常有用,尤其是当你需要对多个文件执行相同操作时。通过使用 FileCollection,你可以编写更简洁、更可读的构建逻辑。

3、文件树

在 Gradle 中,文件树(FileTree)是一种特殊类型的 FileCollection,它表示具有层级结构的文件集合。文件树可以代表一个目录及其所有子目录中的文件,或者可以代表一个压缩文件(如 ZIP 文件)中的内容结构。

文件树不仅具有文件集合的所有功能,还允许你访问文件的相对路径和处理具有层级结构的文件集合。以下是如何创建和使用文件树的示例:

3.1 创建文件树

// 第一种方式:使用路径创建文件树对象,并指定包含的文件
def tree = fileTree('src/main').include('**/*.java')// 第二种方式:通过闭包创建文件树
tree = fileTree('src/main') {include '**/*.java'
}// 第三种方式:通过路径和闭包创建文件树,使用具名参数给 map 传值
tree = fileTree(dir: 'src/main', include: '**/*.java')// 包含多个文件类型,并排除特定的目录或文件
tree = fileTree(dir: 'src/main', includes: ['**/*.java', '**/*.xml', '**/*.txt'], exclude: '**/*test*/**')

3.2 使用文件树

  • 遍历文件树:可以使用 each 方法遍历文件树中的所有文件。
tree.each { File file ->println file // 输出文件的完整路径println file.name // 输出文件名
}

image-20240420181047704

  • 过滤条件:在创建文件树时,你可以使用 includeexclude 方法来指定过滤条件,以包含或排除特定的文件或目录。

3.3 文件树的特点

  • 层级结构:文件树保持了文件的目录结构,允许你访问文件相对于根目录的路径。
  • 过滤模式:使用 Ant 风格的模式(如 **/*.java)来匹配文件和目录。
  • 动态性:文件树的内容是动态生成的,每次访问时都会重新计算,这意味着它会反映文件系统中的当前状态。

3.4 总结

文件树是 Gradle 中处理具有层级结构文件集合的强大工具。通过使用文件树,你可以更方便地处理复杂的文件结构,执行批量文件操作,如复制、删除或分发文件。文件树的过滤功能也使得条件性文件操作变得简单,提高了构建脚本的灵活性和可维护性。

4、文件拷贝

在 Gradle 中,Copy 任务是用来拷贝文件和目录的。它非常灵活,允许你指定要拷贝的文件、目标目录,并且可以通过各种方式来修改拷贝行为,比如过滤、重命名文件等。

4.1 使用 Copy 任务

以下是如何定义和使用 Copy 任务的示例:

task copyTask(type: Copy) {// 指定原文件或目录from 'src/main/java'// 指定目标目录into 'src/main/resources'
}

image-20240420181755062

在这个例子中,from 方法用于指定要拷贝的源文件或目录,而 into 方法用于指定目标目录。

4.2 拷贝时的过滤和重命名

  • 过滤条件:可以使用 includeexclude 方法来添加过滤条件,以包含或排除特定的文件。
task copyTaskWithPatterns(type: Copy) {from 'src/main/webapp'into 'build/explodedWar'// 只拷贝 HTML 和 JSP 文件include '**/*.html'include '**/*.jsp'// 排除以 .html 结尾的文件exclude { details -> details.file.name.endsWith('.html') }
}
  • 重命名:可以使用 rename 方法来指定一个新的文件名,或者提供一个闭包来动态生成文件名。
task rename(type: Copy) {from 'src/main/webapp'into 'build/explodedWar'// 使用闭包方式重命名文件,移除文件名中的 '-staging-' 文本rename { String fileName ->fileName.replace('-staging-', '')}
}

4.3 使用 Project.copy 方法

除了使用 Copy 任务,Gradle 还提供了 Project.copy 方法,它允许你以更简洁的方式执行拷贝操作:

task copyMethod {doLast {copy {// 相对路径或绝对路径from 'src/main/webapp'into 'build/explodedWar'// 包括 HTML 和 JSP 文件include '**/*.html'include '**/*.jsp'}}
}

另一种使用 copy 方法的方式是直接在项目级别进行:

copy {from file('src/main/resources/ddd.txt') // 也可以使用 new File('src/main/resources/ddd.txt')into buildDir.absolutePath
}

这种方法可以直接在项目的任何地方调用,而不必定义为一个任务。

4.4 执行拷贝操作

要执行拷贝操作,你可以运行相应的任务,例如:

gradle copyTask

或者,如果你使用的是 Project.copy 方法,你可以通过调用注册的闭包来执行拷贝:

gradle copyMethod

4.5 总结

Gradle 提供了多种拷贝文件的方法,包括 Copy 任务、Project.copyproject.copy。每种方法都适用于不同的场景,允许你在构建过程中灵活地拷贝文件和目录。通过使用这些方法,你可以轻松地自动化资源的复制,提升构建脚本的效率。

5、归档文件

在 Gradle 中,处理归档文件是一项常见的任务,特别是当你需要将项目打包成 WAR、ZIP、TAR 等格式以便于发布或部署时。以下是如何使用 Gradle 来创建和操作这些归档文件的详细说明:

5.1 创建 Zip 归档文件

  1. 应用插件:首先,确保你的项目中应用了 Java 插件,这将提供创建 JAR 归档文件所需的类和功能。

image-20240420182737310

  1. 定义任务:然后,定义一个名为 myZip 的任务,并指定其类型为 Zip
task myZip(type: Zip) {// 指定ZIP文件内容来源from 'src/main/java'// 指定ZIP文件解压后的内容存放目录into 'build'// 设置ZIP文件的基本名称archiveBaseName = 'myZip'// 设置ZIP文件的扩展名(这里虽然是多余的设置,因为已经默认是zip,但可以用来说明文件类型)archiveExtension = 'zip'// 设置ZIP文件的版本号archiveVersion = '1.0'
}
  1. 执行任务:通过运行 gradle myZip 命令来创建 Zip 文件。
gradle -q myZip

执行上述命令后,Gradle 会在指定的目录中创建一个名为 myGame-1.0.zip 的 Zip 文件。

image-20240420183841075

5.2 使用 zipTreetarTree

Gradle 提供了 zipTreetarTree 方法,它们可以创建一个 FileTree 对象,允许你访问 Zip 或 Tar 压缩包中的内容。这些方法非常适合当你需要将压缩包的内容作为文件集合的一部分来处理时使用。

task zipTree(type: Zip) {// 指定打包的源文件,这里使用zipTree()函数来展开一个Zip文件作为打包的源from(zipTree('build/distributions/myZip-1.0.zip'))// 指定打包后文件的输出目录destinationDirectory = file('build/libs')
}task tarTree(type: Tar) {// 指定打包的源文件,这里使用tarTree()函数来展开一个Tar文件作为打包的源from(tarTree('build/distributions/myTar-1.0.tar'))// 指定打包后文件的输出目录destinationDirectory = file('build/libs')
}

官方文档提供了更多关于 Gradle 文件操作的详细信息,包括如何使用文件路径、文件集合、文件树以及如何处理文件和目录的相对路径等。你可以从以下链接访问官方文档:

  • Gradle 官方文档 - Working With Files

Gradle 提供了强大的文件操作功能,包括创建和操作归档文件。通过定义任务和使用 Gradle 提供的插件,你可以轻松地将项目打包成所需的格式,并执行各种文件操作。这些功能对于自动化构建和持续集成流程至关重要。


http://www.ppmy.cn/server/6746.html

相关文章

生成对抗网络GAN的扩展应用理解

注:本文仅个人学习理解,如需详细内容请看原论文! 一、cycleGAN 1.整体架构: 将图片A通过生成器生成图片B,然后通过判别器判别图片B的真假;并且图片B通过另一个生成器生成A‘,让A和A’近似。 2…

小红书电商运营实战课,从0打造全程实操(65节视频课)

课程内容: 1.小红书的电商介绍 .mp4 2.小红书的开店流程,mp4 3.小红书店铺基础设置介绍 ,mp4 4.小红书店铺产品上架流程 .mp4 5.客服的聊天过程和子账号建立 .mp4 6.店铺营销工具使用和后台活动参加 .mp4 7.小红书产品上架以及拍单教程,mp4 8.小红书如何选品…

自定义类似微信效果Preference

1. 为自定义Preference 添加背景&#xff1a;custom_preference_background.xml <?xml version"1.0" encoding"utf-8"?> <selector xmlns:android"http://schemas.android.com/apk/res/android"><item><shape android:s…

TCP/IP协议—HTTP

TCP/IP协议—HTTP HTTP协议HTTP通讯特点HTTP通讯流程 HTTP请求报文请求方法 HTTP应答报文状态码 HTTP协议 超文本传输协议&#xff08;Hypertext Transfer Protocol&#xff0c;HTTP&#xff09;是一种请求-响应的协议&#xff0c;用户可以通过HTTP向服务器上传、下载数据。HT…

04—常用方法和正则表达式

一、字符串 1.length 属性返回字符串的长度(字符数)。 2.在字符串中查找字符串 indexOf() 字符串使用 indexOf() 来定位字符串中某一个指定的字符首次出现的位置 如果没找到对应的字符函数返回-1 lastIndexOf() 方法在字符串末尾开始查找字符串出现的位置。 3.replace() 方…

C#创建磁性窗体的方法:创建特殊窗体

目录 一、磁性窗体 二、磁性窗体的实现方法 (1)无标题窗体的移动 (2)Left属性 (3)Top属性 二、设计一个磁性窗体的实例 &#xff08;1&#xff09;资源管理器Resources.Designer.cs设计 &#xff08;2&#xff09;公共类Frm_Play.cs &#xff08;3&#xff09;主窗体 …

使用WebSocket实现答题积分排名实时更新的功能

需求分析 接到一个需求&#xff0c;是一个答题积分小程序&#xff0c;其中有一个功能需求是需要实时更新答题积分排名的。之前通常比较常见的需求&#xff0c;都是指定某个时间点才更新答题排行榜的数据的。 经过技术调研&#xff0c;要实现答题积分排名实时更新的功能&#…

docker 安装geoipupdate

前提是docker已安装 一&#xff1a;执行命令&#xff1a; docker run --env-file /usr/local/etc/GeoIP.conf -v /usr/local/GeoIP2:/usr/share/GeoIP ghcr.io/maxmind/geoipupdate /usr/local/etc/GeoIP.conf &#xff1a;本地配置的账号&#xff0c;秘钥 GEOIPUPDATE_AC…

k8s安装记录

k8s安装记录 如无特别说明&#xff0c;则该步操作指在所有的机器上执行&#xff01;&#xff01;&#xff01; 如无特别说明&#xff0c;则该步操作指在所有的机器上执行&#xff01;&#xff01;&#xff01; 如无特别说明&#xff0c;则该步操作指在所有的机器上执行&#…

iOS知识点---Runloop

iOS 中的 Runloop 机制是一种事件驱动模型&#xff0c;用于管理和调度线程上的事件&#xff0c;确保线程在有工作要做时保持活跃&#xff0c;无事可做时进入休眠状态以节省系统资源。以下是 Runloop 机制的关键组成部分及其工作原理&#xff1a; 关键组成部分与原理&#xff1…

4 种策略让 MySQL 和 Redis 数据保持一致

先阐明一下 MySQL 和 Redis 的关系&#xff1a;MySQL 是数据库&#xff0c;用来持久化数据&#xff0c;一定程度上保证数据的可靠性&#xff1b;Redis 是用来当缓存&#xff0c;用来提升数据访问的性能。 关于如何保证 MySQL 和 Redis 中的数据一致&#xff08;即缓存一致性问…

过拟合与欠拟合

过拟合与欠拟合 过拟合有较为明显的对比可以判断&#xff0c;但欠拟合却是不容易判断的。 训练集效果很好&#xff0c;测试集效果变差&#xff0c;在保证训练集与测试集样本分布一致的情况下&#xff0c;很容易得出过拟合的结论。 欠拟合不太容易通过这种直接的对比来判断。 …

深入解读:BIO、NIO与IO多路复用——理解现代网络编程基石

在现代软件开发中&#xff0c;高效的数据交换是构建高性能网络应用的核心要素。深入理解输入输出&#xff08;Input/Output,简称IO&#xff09;模型的底层原理与工作机制&#xff0c;对于设计和实现高并发、低延迟的网络服务至关重要。本文将深度剖析阻塞式I/O&#xff08;BIO&…

OpenHarmony轻量系统开发【5】驱动之GPIO点灯

5.1点灯例程源码 先看最简单得LED灯闪烁操作 源码结构如下&#xff1a; 第一个BUILD.gn文件内容&#xff1a; static_library("led_demo") {sources ["led_demo.c"]include_dirs ["//utils/native/lite/include","//kernel/liteos_m/c…

Oracle解析exp、imp及常见的问题

前言 在工作中经常需要不同数据库的导入和导出。exp和imp可以实现数据的迁移。 exo会转储产生对应的二进制文件,里面包括数据的定义信息、数据内容等,即为dump文件。 下面是使用exp和imp的一些场景 exp和imp主要有4中模式: 1)数据库模式 数据库模式也就是我们说的全备…

Windows 安装 A UDP/TCP Assistant 网络调试助手

Windows 安装 A UDP/TCP Assistant 网络调试助手 0. 引言1. 下载地址2. 安装和使用 0. 引言 需要调试一个实时在线聊天程序&#xff0c;安装一个UDP/TCP Assistant 网络调试助手&#xff0c;方便调试。 1. 下载地址 https://github.com/busyluo/NetAssistant/releases 2. 安…

如何进行数据库的迁移与同步——【DBA 从入门到实践】第四期

在日常的数据库运维工作中&#xff0c;我们时常会面临数据库替换、机房搬迁、业务测试以及数据库升级等任务&#xff0c;这些任务都需要对数据进行迁移和同步操作。【DBA 从入门到实践】第4期&#xff0c;将引导大家深入了解数据库迁移的流程&#xff0c;并探讨在迁移过程中可用…

牛客周赛 Round 40(补题)C题

链接&#xff1a;登录—专业IT笔试面试备考平台_牛客网 来源&#xff1a;牛客网 题目描述 小红拿到了一个长度为nnn的数组aaa&#xff0c;她希望你构造两个排列ppp和qqq&#xff0c;满足对于i∈[1,n],aii∈[1,n],a_ii∈[1,n],ai​为pip_ipi​或qiq_iqi​二选一。你能帮帮她…

【JAVA基础篇】泛型详解版

&#x1f525;作者主页&#xff1a;小林同学的学习笔录 &#x1f525;mysql专栏&#xff1a;小林同学的专栏 目录 1.泛型的认识 2.泛型类 3.泛型方法 4.泛型接口 5.特别强调 6.类型通配符 简单化知识点&#xff0c;让你彻底了解泛型 1.泛型的认识 Java泛型是一种在Java编程语言…

体验AI驱动的软件开发 | 普元低代码社区版使用

更多ruoyi-nbcio功能请看演示系统 gitee源代码地址 前后端代码&#xff1a; https://gitee.com/nbacheng/ruoyi-nbcio 演示地址&#xff1a;RuoYi-Nbcio后台管理系统 http://122.227.135.243:9666/ 更多nbcio-boot功能请看演示系统 gitee源代码地址 后端代码&#xff1a…